изменение chmod для файлов, но не для каталогов

StackOverflow https://stackoverflow.com/questions/1163294

  •  18-09-2019
  •  | 
  •  

Вопрос

Мне нужно использовать 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`

с помощью http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed

"находить .-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 {} +;

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top