Chmod рекурсивно

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

Я просмотрел эту тему: 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 {} +

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

Ответ 1

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

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

Ответ 2

Вы можете использовать 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

Ответ 3

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

chmod -R +xr

Ответ 4

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

chmod -R 0755

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

chmod -R 0777

Ответ 5

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

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

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

Ответ 6

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

chmod -R 0777./