-1

У меня есть строка каталогов, и я хочу изменить разрешение для всех этих каталогов на 775 (rwxrwxr-x) с помощью команды, такой как chmod.

Проблема в том, что строка является редактируемой, поэтому она может отличаться от пользователя к пользователю, поэтому chmod -R не работает, потому что один пользователь может иметь

/apple/a/b 

в то время как другой пользователь

/android/a/b/c/d

Спасибо за помощь :)

2 ответа2

1

Если переменная строка содержит путь /a/b/c/d , следующие инструкции изменят права доступа для /a , /a/b , /a/b/c и /a/b/c/d:

(
    IFS=/
    unset substring

    for dir in $string; do
        unset IFS
        substring="$substring$dir/"
        test "$substring" != "/" && chmod 755 "$substring"
    done
)

Как это устроено

  • Скобки выполняют все в подоболочке, поэтому изменение переменных IFS и подстроки не окажет никакого влияния за пределы подоболочки.

  • IFS=/ устанавливает для внутреннего разделителя файлов косую черту, поэтому цикл for будет разбивать $string в слешах.

  • for dir in $string; do ... done будет выполняться ... один раз для каждого компонента в $string .

    В нашем примере $dir примет значения , a , b , c и d .

  • unset IFS изменяет внутренний разделитель файлов на значения по умолчанию, так как это повлияет на косые черты в путях каталогов.

  • substring="$substring$dir/" добавляет текущее значение $dir к $substring .

    В нашем примере $susbtring будет принимать значения / , /a/ , /a/b/ , /a/b/c/ и /a/b/c/d/ .

  • test "$substring" != "/" && chmod 755 "$substring" проверяет, отличается ли текущее значение $susbtring от / .

    Если это так, он устанавливает желаемые разрешения.

0

Ваш вопрос не очень понятен. Являются ли эти каталоги подкаталогами друг друга? Во всяком случае, вот несколько вариантов:

  1. Изменить разрешения для dir1 и всех его подкаталогов и файлов

    chmod -R 775 dir1
    
  2. Изменить разрешения для dir1 и определенных подкаталогов

    chmod  775 dir1 dir1/dir2 /dir1/dir2/dir3
    
  3. Изменить разрешения на все подкаталоги dir1

    find dir1 -type d -exec chmod 775 {}\;
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .