Рекурсивный chmod: rw для файлов, rwx для каталогов


28

Я хочу chmodмного файлов и каталогов. Как xуказывает список для каталогов и выполнить для обычных файлов, я хотел бы подать заявку rwна файлы и rwxдля каталогов. Возможно ли использовать только chmodкоманду?

Если это не так, какой самый удобный способ?

Это chmod -R 770невозможно, так как я не хочу, чтобы обычные файлы стали исполняемыми.


1
Вы действительно хотите публичное разрешение на запись в файлы и каталоги? Это означает, что вам все равно, кто захлопывает какие-либо файлы?
Джонатан Леффлер

Правда. Я изменил это выше.
удалено

Ответы:


19

Я делаю это иногда, используя одну findкоманду. Уродливый, но эффективный.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)

Разве "{}" не нужно заключать в кавычки, только если пути содержат пробелы? Нравится find . -type d -exec chmod -vc 755 "{}" \;(в том числе -vcдля некоторых отзывов). (И, может быть, просто для пояснения, добавьте две отдельные команды к ответу?)
Арджан,

Нет, {} не нужно заключать в кавычки (я только что проверил, чтобы быть абсолютно уверенным). Когда find вставляет {} в команду, она правильно экранируется. Я не посмотрел внутреннюю работу find, но я бы предположил, что он создает массив аргументов для передачи в exec (), и он будет strcpy () с именем файла в массиве. Когда chmod смотрит на свои аргументы, он выглядит правильно.
Баумгарт

37

Используйте разрешение X со страницы руководства:

Биты выполнения / поиска, если файл является каталогом, или любой из битов выполнения / поиска установлены в исходном (неизмененном) режиме. Операции с разрешающим символом «X» имеют смысл только в сочетании с операционным символом «+» и игнорируются во всех других случаях.

Так что сделайте следующее:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Это удаляет бит выполнения из всех файлов и каталогов с последующим добавлением привилегий чтения и записи ко всем и привилегий выполнения только для каталогов. (Никакие обычные файлы больше не имеют бит выполнения с первого шага.)


1
это не заставит режим 666 на обычных файлах. он не очищает исполняемый бит для обычных файлов, если он уже установлен.
Квик-кихот

Так в таком случае вы могли бы сделать с chmod -R a-x [directory]последующим chmod -R a+rwX [directory]?
Jwaddell

@jwaddel: Это должно сработать. Вы удаляете все биты выполнения независимо от типа файла / каталога, а затем добавляете команду execute только в каталоги и обычные файлы, в которых уже есть бит выполнения (которого сейчас нет).
Ben S

Как только я это сделаю a-x, каталог не будет доступен. Фактически, chmod завершается неудачно с запрещенным разрешением и не удаляет исполняемый бит из файлов в каталоге. Есть ли способ сделать это, не будучи root?
Авакар

14

Вы также можете использовать findвместе с xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

где -typeуказывает d irectory или ф ИОС.


1
Разве у xargs нет ограничения по длине? Это много файлов и каталогов.
удалено

2
Я бы сначала делал каталоги, потом файлы. В противном случае вы рискуете пропустить некоторое поддерево из-за отсутствия разрешения. Кроме того, вы должны проверить, просматривается ли список до или после chmod, в противном случае, так же, как указано выше. И да, я бы воздержался от использования xargs.
Стефано Борини

1
xargsдостаточно умен, чтобы разбить длинные командные строки на несколько исполнений. Обратитесь к странице справочника xargs и обязательно проверьте xargs --show-limits.
Майк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.