Изменение chmod для файлов, но не каталогов
Мне нужно использовать chmod для рекурсивного преобразования всех файлов на 664. Я бы хотел пропустить папки.
Я думал сделать что-то вроде этого
ls -lR | grep ^-r | chmod 664
Это не работает, я предполагаю, потому что я не могу подключиться к chmod
Кто-нибудь знает простой способ сделать это?
Спасибо
Ответы
Ответ 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`
Ответ 4
через http://www.linuxquestions.org/questions/aix-43/chmod-recursion-files-only-208798/?s=a70210fb5e5d0aa7d3c69d8e8e64e3ed
"find. -type f -print | xargs chmod 444" shoud work, не так ли? Если нет, найдите. -print > myfile.sh и vi myfile.sh удаляет каталоги (их не должно быть много), а затем 1, $s/^/chmod 444/ и sh myfile.sh.
Ответ 5
с GNU find
find /path -type f -exec chmod 644 {} +;