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./