Chmod рекурсивно

249

У меня есть архив, который заархивирован кем-то другим, и я хочу автоматически, после загрузки, изменить ветвь файловой системы в извлеченных файлах, чтобы получить доступ для чтения. (Я не могу изменить способ создания архива).

Я заглянул в эту ветку: chmod: Как рекурсивно добавить разрешения на выполнение только к файлам, которые уже имеют разрешение на выполнение, как к другим, но не радуются.

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

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Это лишь немногие, что я обнаружил до сих пор, но может быть и больше.

findошибки, когда пытается заглянуть в каталог без xразрешения и поэтому не передает его chmod. До сих пор я вручную изменял разрешения для родительского каталога, затем заходил в дочерние каталоги, делал то же самое для них и так далее. Но это много ручного труда. Разве нет способа сделать это автоматически?

Т.е. как я это делаю сейчас:

делать:

$ chmod -R +x
$ chmod -R +r

пока я не получу ошибок, то

$ find -type f -exec chmod -x {} +

Но должен быть лучший способ.

Сообщество
источник
3
-r не то же самое, что -R
PJ Brunet
Кроме того, если вы хотите сказать, чтобы все разрешения групп соответствовали разрешениям владельца (кажется, менее вероятно, что все испортит
ThorSummoner

Ответы:

131

Вам нужен доступ для чтения, в дополнение к выполнению доступа, чтобы получить список каталогов. Если у вас есть только доступ на выполнение, вы можете узнать имена записей в каталоге, но не иметь никакой другой информации (даже типов, поэтому вы не знаете, какие записи являются подкаталогами). Это работает для меня:

find . -type d -exec chmod +rx {} \;
Фред Фу
источник
2
В чем разница между '\;' и '+', который использовался OP в конце команды?
Кон Псих
1
@konpsych Видимо +строит командную строку по-другому. Я на самом деле не знал об этом; \;это обычный способ, с одной командой на файл, который соответствует поиску.
Фред Фу
Не работает, если в некоторых файлах есть пробелы в названии
Soonts
3
@Soonts Тогда "{}"вместо того, {}чтобы исправить это.
user4642212
Я запустил это в подсистеме Linux на Windows 10, и это имело противоположный эффект. Большинство прав доступа к файлам были удалены.
Макс Кандокия
176

Вы можете использовать chmod с Xбуквой режима (заглавная буква X), чтобы установить исполняемый флаг только для каталогов.

В приведенном ниже примере исполняемый флаг очищается и затем рекурсивно устанавливается для всех каталогов:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Немного пояснений:

  • chmod -x foo- очистить флаг eXecutable дляfoo
  • chmod +x foo- установите флаг eXecutable дляfoo
  • chmod go+x foo- то же, что и выше, но установите флаг только для пользователей группы и других пользователей, не трогайте разрешение пользователя (владельца)
  • chmod go+X foo - то же, что и выше, но применяется только к каталогам, не трогайте файлы
  • chmod -R go+X foo- то же, что и выше, но сделать это рекурсивно для всех подкаталоговfoo
Дмитрий
источник
80

Попробуйте изменить все разрешения одновременно:

chmod -R +xr
choroba
источник
Это также даст права на выполнение для всех не-каталогов.
Фред Фу
1
Да. Это просто заменяет первый повторный шаг. Вы все еще должны бежать find -type f -exec chmod -x {} +позже.
Чороба
50

Чтобы сделать все доступным для записи владельцем, чтение / выполнение группой и исполняемым файлом:

chmod -R 0755

Чтобы все было широко открыто:

chmod -R 0777
Тим Дженсен
источник
12
Добавьте текущее местоположение папки:chmod -R 0777 .
Даниэль
18

Добавление исполняемых прав доступа рекурсивно ко всем файлам (не папкам) в текущей папке с shрасширением:

find . -name '*.sh' -type f | xargs chmod +x

* Обратите внимание на трубу ( |)

AlikElzin-kilaka
источник
2

Дайте 0777 всем файлам и каталогам, начиная с текущего пути:

chmod -R 0777 ./

Энтони Винай
источник