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

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

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

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

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

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

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

(цитируется на странице man chmod ).

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

 find /path \( -type f -exec chmod ug=rw,o=r {} + \) -o \ \( -type d -exec chmod ug=rwx,o=rx {} + \) 

Использование 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), затем вызывает команду и начинает перестройку новой команды. Последний оператор порождает новый процесс для каждого файла, поэтому он менее эффективен.