2016-12-20 8 views
1

У меня есть необходимость сделать некоторые папки/файлы (рекурсивные) иметь те же права, что и у пользователя. Итак:chmod - реплицировать разрешения пользователя на группу/мир

  • 0755 -> 0777
  • 0644 -> 0666

Как я могу это сделать? Возможно, небольшая секретная команда, о которой я знаю?

Если нет простого способа, то, возможно, мне понадобится создать цикл и test/assign. В конечном итоге мне нужно иметь дело только с 3-х типов:

Папки должны быть 777, большинство файлов 666, исполняемые 777.

ответ

2

find может сделать работу по поиску файлов с заданным набором разрешений и запуск наименьшее возможное число chmod вызовов, необходимых для их покрытия.

find . \ 
    '(' -perm -0700 -exec chmod 0777 '{}' + ')' -o \ 
    '(' -perm -0600 -exec chmod 0666 '{}' + ')' 
0

Там нет команды, которая делает для вас. Вам нужно немного цикл:

for file in $(find . -print) 
do 
    if [ -d $file -o -x $file ]; then 
    chmod 777 $file 
    else 
    chmod 666 $file 
    fi 
done 
+2

Это очень, очень багги. Посмотрите, что происходит с именами файлов с пробелами или подстановочными знаками. Кроме того, запустите его через http://shellcheck.net/ и исправьте проблемы с котировками. –

+0

... и что касается общей практики 'для файла в $ (find. -print)', см. [BashPitfalls # 1] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A. mp3.29) и [DontReadLinesWithFor] (http://mywiki.wooledge.org/DontReadLinesWithFor). –

+0

... если вы хотите иметь возможность безопасно и правильно обрабатывать произвольные имена файлов из 'find' в ваших сценариях оболочки, вам нужно либо использовать действие' -exec', чтобы передать их в ваш скрипт на argv, либо '-print0 'для генерации потока, ограниченного NUL. Найдите '-print0' в [BashFAQ # 1] (http://mywiki.wooledge.org/BashFAQ/001) для примера последнего или раздел« Комплексные действия »в [UsingFind] (http: // mywiki.wooledge.org/UsingFind) для обсуждения обоих. –