Подтвердить что ты не робот

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

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

ls -lR | grep ^-r | chmod 664

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

Спасибо

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Linux:

$ chmod 644 `find -type f`

OSX:

$ chmod 644 `find . -type f`

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

$ chmod 644 `find /home/my/special/folder -type f`

Ответ 5

с GNU find

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