рекурсивно изменить разрешение файла, но не каталоги?

13

Я делал массовые рекурсивные изменения прав доступа к некоторым файлам, которые я перенес в систему Unix. Я изменил их на ug + rw, но потом обнаружил, что не могу просматривать подкаталоги. Я заглянул на страницу chmodсправочника и не увидел никакого объяснения об исключении каталогов, поэтому немного погуглил и обнаружил, что люди findрекурсивно меняли права на каталоги для «выполнения» для пользователя и группы. Я сделал это, и тогда я мог посмотреть на них.

Но мне показалось, что я должен быть в состоянии сделать эту находку chmod- рекурсивно изменять файлы для чтения / записи, но не делать каталоги необратимыми. Я сделал это «правильным» способом или есть более простой способ сделать это?

user394
источник

Ответы:

12

Лучшее решение должно быть

chmod -R ug=rwX,o=rX /path

где заглавная Xозначает: установите бит выполнения, если

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

(цитата из chmodсправочной страницы).

Или также, если вы хотите использовать find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)
enzotib
источник
Я использовал широко открытую для всех версию этой команды для своего жесткого диска USB: chmod -v -R ugo = rwX / path Спасибо!
Чувак
Очевидно, что нет способа без findустановки всех разрешений для файлов на 600 и всех разрешений для каталогов на 700. (Я прибыл сюда через свои поиски по теме.) Если это можно сделать с помощью одной chmod -Rкоманды, не стесняйтесь исправлять меня.
Wildcard
@Wildcard: не совсем, команда chmod -R u=rwX,go= /pathделает почти то, что вам нужно: она устанавливает все каталоги в 700 и все файлы в 600 или 700, в зависимости от того, установлен ли бит выполнения или нет, и я думаю, что это правильно ,
энзотиб
1
@enzotib, да - почти, но не совсем. В моем случае я хочу отключить бит выполнения для всех файлов (но, конечно, не для каталогов), независимо от того, являются ли они скриптами, двоичными файлами или чем-то еще. Таким образом, findкоманда, которую вы написали, была очень полезна в качестве шаблона. :)
Wildcard
@Wildcard, как насчет того, чтобы сначала удалить бит выполнения, рекурсивно, а затем добавить его обратно только в каталоги с помощью приведенной выше команды?
Майкл
3

Использование find - это «правильный» и единственный программный способ, хотя есть и варианты:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

или

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

или самый медленный:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Каждый из них выбирает файл (не каталог, не символическую ссылку) и применяет к нему chmodкоманду. Первые два уменьшают количество вызовов chmod, добавляя файл в конец внутренней командной строки каждый раз, пока не будет достигнут максимум (часто 10), затем вызывает команду и начинает перестраивать новую команду. Последний оператор порождает новый процесс для каждого файла, поэтому он менее эффективен.

Arcege
источник