Назад | Перейти на главную страницу

Правильный рекурсивный chmod, отдельный для файлов и каталогов

Я хотел бы рекурсивно изменить каталог так, чтобы:

Как сделать лучше, короче, наряднее? :) Может как-нибудь использовать umask?

Все find решения слишком длинные: я всегда заканчиваю Copy-Paste :)

В зависимости от вашей версии chmod вы можете сделать это:

chmod -R . ug+rwX,o+rX,o-w

Обратите внимание капитал X. Это устанавливает исполняемый бит для каталогов и файлов, в которых уже установлен какой-либо бит выполнения.

Обратите внимание, что вы можете использовать только заглавную X с '+', но не '=' или '-'.

Лучше, короче, красивее, чем что?

cd /directory
find . -type d -exec chmod 0755 {} +
find . -type f -exec chmod 0664 {} +

Добавление одного лайнера в смесь

find -type f -exec chmod 0644 {} + -o -type d -exec chmod 0755 {} +
find /dir -type f -print0 |xargs -0 chmod 0644
find /dir -type d -print0 |xargs -0 chmod 0775

Протестируйте его перед использованием в реальной среде

Я использую это для всего, что скопировано из файловых систем FAT:

chmod -R a-x+X .

Если это не работает, например, в Mac OS X, попробуйте версию команды GNU chmod:

gchmod -R a-x+X .

Не зная больше о том, почему вы пытаетесь это сделать, наиболее распространенные причины, по которым люди склонны использовать:

  • Файлы и каталоги доступны для записи

    chmod -R o-w /path/to/dir

  • Файлы и каталоги не подлежат групповой записи

    chmod -R g+w /path/to/dir

Или объедините два:

chmod -R o-w,g+w /path/to/dir

В качестве альтернативы, если вы хотите, чтобы файлы и каталоги имели правильные разрешения по умолчанию, измените процесс создания umask.

По сути, это редкий день, когда правильно использовать числовые режимы с chmod; как правило, в каталогах уже установлен исполняемый бит, а в файлах, которым он не нужен, он отсутствует, так зачем вообще возиться с ним, когда + и - операторы избавляют от необходимости это делать?