изменение chmod для файлов, но не для каталогов
Вопрос
Мне нужно использовать chmod, чтобы рекурсивно изменить все файлы на 664.Я хотел бы пропустить папки.Я думал сделать что-то вроде этого
ls -lR | grep ^-r | chmod 664
Это не работает, я предполагаю, потому что я не могу вписаться в CHMOD, кто -нибудь знает о простом способе сделать это?
Спасибо
Решение
А find -exec
Ответ хороший, но он страдает обычно несущественным недостатком, заключающимся в создании отдельного подпроцесса для каждого отдельного файла.Однако он прекрасно функционален и будет работать плохо только при увеличении количества файлов. Действительно большой.С использованием xargs
группирует имена файлов в большие группы перед запуском подпроцесса для этого группа файлов.
Вам просто нужно быть осторожным, чтобы при использовании xargs
, вы правильно обрабатываете имена файлов со встроенными пробелами, символами новой строки или другими специальными символами.
Решение, которое решает обе эти проблемы (при условии, что у вас достаточно приличный find
и xargs
выполнение):
find . -type f -print0 | xargs -0 chmod 644
А -print0
причины find
завершить имена файлов в выходном потоке символом NUL (а не пробелом) и -0
к xargs
сообщает ему, что он должен ожидать этого в качестве входного формата.
Другие советы
Другой способ сделать это — использовать find ... -exec ...
следующее:
find . -type f -exec chmod 644 {} \;
Проблема в том, что -exec
начинает chmod
процесс для каждого файла.А xargs
подход позволяет избежать этого и является лучшим при условии, что у вас есть версия find
и xargs
это может решить проблему «пробелов в именах путей»;см. принятый ответ.
И, кстати, использование обратных кавычек может привести к сбою, если файлов, требующих chmoding, слишком много, или совокупная длина имен путей слишком велика.
Мои краткие два цента...
Линукс:
$ chmod 644 `find -type f`
ОС:
$ chmod 644 `find . -type f`
Это работает для рекурсивного изменения всех файлов, содержащихся в текущем каталоге и всех его подкаталогах.Если вы хотите настроить таргетинг на другой каталог, замените .
с правильным путем:
$ chmod 644 `find /home/my/special/folder -type f`
"находить .-type f -print | xargs chmod 444 "Shoud работает, не так ли?Если нет, найдите.-print> myfile.sh и vi myfile.sh Удаление каталогов (они не должны быть так много), а затем 1, $ s/^/chmod 444/и sh myfile.sh.
с помощью GNU найти
find /path -type f -exec chmod 644 {} +;