Короткий ответ
find ./ -type f ! \( -perm -u=rw -and -perm -g=rw -and -perm -o=r -and ! -perm /o=wx \)
Длинный ответ
Поскольку кажется проще указать, что мы хотим (x имеет разрешение y ) в find
, давайте попробуем сопрягать выражение: мы видим, что для файла, который не должен совпадать, проверены все эти условия:
- пользователь прочитал и написал
- группа читает и пишет
- другой прочитал
- другого нет (напиши или выполни)
Так что теперь у нас больше , чем раньше (5 против 2). Я написал команду, которая находит файлы, которые вам не нужны:
find ./ -type f -perm -u=rw -and -perm -g=rw -and -perm -o=r -and ! -perm /o=wx
Чтобы понять это, вы должны учитывать тот факт, что -
означает все разрешения и /
означает любое из разрешений.
Тогда я соединила это с! и скобки, чтобы получить команду в верхней части этого ответа.
тесты
Давайте создадим файлы, которые проверяют только один из этих критериев:
mkdir demo && cd demo
touch a b c d e f g
chmod 777 a b c d e f g
chmod u-r a
chmod u-w b
chmod g-r c
chmod g-w d
chmod o-r e
chmod o-w a b c d e g
chmod o-x a b c d e f
Тогда давайте создадим все файлы, которые не должны совпадать: у нас есть свободы на
- права пользователя на исполнение
- права на групповое исполнение
Что дает ровно 2 ^ 2 = 4 типа полных разрешений, которые не должны совпадать.
Давайте создадим 4 файла с этими критериями:
touch h i j k
chmod 664 h i j k
chmod u+x h i
chmod g+x h j
Предоставленная команда должна соответствовать файлам a-e, но не файлам h-k. Конечно, этот тест не является исчерпывающим, потому что есть 256 типов разрешений для тестирования.