Команду 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 ответов:
вам нужен доступ для чтения, в дополнение к выполнению доступа, чтобы перечислить каталог. Если у вас есть только доступ к 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