изменение chmod для файлов, но не для каталогов - PullRequest
64 голосов
/ 22 июля 2009

Мне нужно использовать chmod для рекурсивного изменения всех файлов на 664. Я хотел бы пропустить папки. Я думал сделать что-то подобное

ls -lR | grep ^-r | chmod 664

Это не работает, я предполагаю, потому что я не могу передать в chmod Кто-нибудь знает простой способ сделать это?

Спасибо

Ответы [ 5 ]

98 голосов
/ 22 июля 2009

A find -exec хороший ответ, но он страдает от обычно несущественного недостатка, заключающегося в том, что он создает отдельный подпроцесс для каждого отдельного файла. Тем не менее, он идеально функционирует и будет работать плохо только тогда, когда количество файлов станет действительно большим. Использование xargs объединит имена файлов в большие группы перед запуском подпроцесса для этой группы файлов.

Вам просто нужно быть осторожным, чтобы при использовании xargs вы правильно обрабатывали имена файлов со встроенными пробелами, переводами строки или другими специальными символами в них.

Решение, которое решает обе эти проблемы (при условии, что у вас достаточно приличная реализация find и xargs):

find . -type f -print0 | xargs -0 chmod 644

-print0 заставляет find завершать имена файлов в своем выходном потоке символом NUL (а не пробелом), а от -0 до xargs дает ему знать, что следует ожидать, что в качестве ввода формат.

29 голосов
/ 22 июля 2009

Другой способ сделать это - использовать find ... -exec ... следующим образом:

find . -type f -exec chmod 644 {} \;

Проблема в том, что -exec запускает процесс chmod для каждого файла. Подход xargs избегает этого и является лучшим при условии, что у вас есть версии find и xargs, которые могут справиться с проблемой "пробелов в путях"; см. принятый ответ.

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

18 голосов
/ 24 марта 2014

Мои краткие два цента ...

Linux:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

Это работает для рекурсивного изменения всех файлов, содержащихся в текущем каталоге и всех его подкаталогах. Если вы хотите настроить таргетинг на другой каталог, замените . на правильный путь:

$ chmod 644 `find /home/my/special/folder -type f`
2 голосов
/ 22 июля 2009

с GNU find

find /path -type f -exec chmod 644 {} +;

2 голосов
/ 22 июля 2009

через http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

"найди. -Тип f -print | xargs chmod 444", да? Если нет, найдите. -print> myfile.sh и vi myfile.sh удаляет каталоги (их не должно быть слишком много), а затем 1, $ s / ^ / chmod 444 / и ш myfile.sh.

...