A find -exec
хороший ответ, но он страдает от обычно несущественного недостатка, заключающегося в том, что он создает отдельный подпроцесс для каждого отдельного файла. Тем не менее, он идеально функционирует и будет работать плохо только тогда, когда количество файлов станет действительно большим. Использование xargs
объединит имена файлов в большие группы перед запуском подпроцесса для этой группы файлов.
Вам просто нужно быть осторожным, чтобы при использовании xargs
вы правильно обрабатывали имена файлов со встроенными пробелами, переводами строки или другими специальными символами в них.
Решение, которое решает обе эти проблемы (при условии, что у вас достаточно приличная реализация find
и xargs
):
find . -type f -print0 | xargs -0 chmod 644
-print0
заставляет find
завершать имена файлов в своем выходном потоке символом NUL (а не пробелом), а от -0
до xargs
дает ему знать, что следует ожидать, что в качестве ввода формат.