Хорошо, я перечитал справочные страницы "chmod" для Mac OS X, BSD и Linux и провел несколько экспериментов. Вот что я узнал о символических режимах. Это может быть сложно, но это стоит понять:
- Общая форма - это пункт [, пункт ...], где:
- предложение : = [ugoa] [+ - =] [rwxXstugo]
- [ugoa] ( кто ) (указать несколько) означает установить разрешение для пользователя, группы, других или всех. Если не указано, по умолчанию используется значение «а», но действует маска .
- [+ - =] ( действие ) (указать одно) означает:
- + означает добавление указанных разрешений к уже действующим разрешениям
- - означает удаление указанных разрешений из разрешений, уже действующих
- = означает установить разрешения для указанных разрешений, очистив все остальные
- [rwxXstugo] ( разрешение ) (укажите несколько из rwxXst ИЛИ одно из ugo) устанавливает разрешения для указанных пользователей следующим образом:
- r - читать
- w - написать
- x - выполнить / поиск
- X - выполнить / выполнить поиск, если каталог ИЛИ любой бит выполнения уже был установлен.
- s - suid или sgid
- т - липкий
- u - скопировать разрешение пользователя
- g - скопировать разрешение группы
- o - скопировать другое разрешение
Так, например, a+x
сделал бы файл исполняемым всеми. a+X
сделает файл исполняемым всеми, если он исполняется кем угодно.
a+x
сделает каталог доступным для поиска всеми. a+X
также сделает каталог доступным для поиска всеми.
Основное различие между BSD и Linux заключается в том, что с BSD определение выполняется на основе прав доступа к файлу до выполнения chmod. При использовании Linux определение выполняется непосредственно перед выполнением предложения + X.
Таким образом, в случае BSD комбинация a-x,a+X
уберет разрешение на выполнение / поиск, а затем сделает каталог доступным для поиска для всех и сделает файл исполняемым для всех. если он изначально был исполняемым кем-либо.
С Linux, a-x,a+X
удаляет разрешение на выполнение / поиск, а затем делает каталог доступным для поиска для всех, оставляя файл исполняемым никем.
Вот конкретный пример: на компьютере BSD: каталог, исполняемый файл и неисполняемый файл:
drwxr-x--- 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--- 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
Обратите внимание, что как каталог, так и «fie» выполняются / доступны для поиска пользователем, но не другими.
Сейчас мы выполняем chmod a-x,a+X *
. В первом предложении для всех файлов будет удален бит выполнения / поиска для всех пользователей, а во втором предложении он будет добавлен обратно как для "fee", так и для "fie". "fee", потому что это каталог, и "fie", потому что у него был хотя бы один исполняемый бит для начала.
drwxr-x--x 2 falk staff 68 Jul 19 18:01 fee/
-rwxr-x--x 1 falk staff 0 Jul 19 18:01 fie*
-rw-r----- 1 falk staff 0 Jul 19 18:01 foe
У меня был тот же результат выполнения chmod -x+X
.
Вывод: решение Jak Gibb будет работать на Linux, но для BSD вам нужно будет сделать два прохода.
Я не проверял это на SVr4 или других вариантах Unix.