Команду chmod рекурсивно


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

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

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

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

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

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

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

do:

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

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

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

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

5 188

5 ответов:

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

find . -type d -exec chmod +rx {} \;

вы можете использовать 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 - понятно исполняемый файл флаг foo
  • chmod +x foo - установить исполняемый файл флаг foo
  • chmod go+x foo - то же, что и выше, но установить флаг только для группа и другое пользователи, не трогай (владелец) разрешение
  • chmod go+X foo - то же, что и выше, но применяются только к каталогам, не трогайте файлы
  • chmod -R go+X foo - то же, что и выше, но сделайте это рекурсивно для всех подкаталогах foo

попробуйте изменить все persmissions в то же время:

chmod -R +xr

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

chmod -R 0755

чтобы сделать все широко открытым:

chmod -R 0777

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