Командная строка Linux
Шрифт:
– samefile имя
Действует так же, как проверка -inum. Соответствует файлам с тем же номером индексного узла (inode), что и файл с указанным именем
– size n
Соответствует файлам с размером n
– type c
Соответствует файлам с типом c
– user имя
Соответствует файлам или каталогам, принадлежащим пользователю с указанным именем. Аргумент имя может быть именем или числовым идентификатором пользователя
Это не полный список. Дополнительные детали ищите на странице справочного руководства (man) для команды find.
Операторы
Несмотря
[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not –perm 0700 \)
Ф-фу! Как неизящно! Что все это значит? На самом деле операторы перестанут казаться избыточно сложными, как только вы с ними познакомитесь поближе (табл. 17.4).
Имея список операторов под рукой, попробуем разобрать команду find. На самом верхнем уровне мы видим, что проверки объединены в две группы, разделенные оператором -or:
(выражение 1) -or (выражение 2)
Таблица 17.4. Логические операторы, поддерживаемые командой find
Оператор
Описание
– and
Соответствует, если выполняются условия в проверках с обеих сторон от оператора. Можно сократить до -a. Обратите внимание, что в отсутствие операторов по умолчанию подразумевается -and
– or
Соответствует, если выполняется условие с одной из сторон от оператора. Можно сократить до -o
– not
Соответствует, если условие в проверке, следующей за оператором, не выполняется. Можно сократить до -!
Группируют проверки и операторы для формирования крупных выражений. Используются для управления порядком проверок. По умолчанию проверки выполняются слева направо. Часто используются для изменения порядка проверок по умолчанию, чтобы получить желаемый результат. Даже если скобки не нужны, иногда полезно включать их, чтобы сделать команды более наглядными. Не забывайте, что круглые скобки имеют специальное значение для командной оболочки, поэтому их нужно экранировать, чтобы они передавались команде find как аргументы. Обычно экранирование выполняют с помощью символа обратного слеша
В этом есть определенный смысл, потому что мы хотим найти файлы с одним набором разрешений и каталоги – с другим. Но если выполняется поиск
(файл с плохими разрешениями) -or (каталог с плохими разрешениями)
Наша следующая задача — проверить «плохие разрешения». Как это сделать? Фактически никак. Но мы можем проверить «неудовлетворительные разрешения», зная, что такое «удовлетворительные разрешения». В случае с файлами удовлетворительными являются разрешения 0600, для каталогов — 0700. Выражение, проверяющее «неудовлетворительные» разрешения, выглядит так:
– type f -and -not -perms 0600
а для каталогов так:
– type d -and -not -perms 0700
Как отмечалось в табл. 17.4, оператор -and можно просто удалить, так как он подразумевается по умолчанию. Теперь, объединив все вместе, мы получим окончательную команду:
find ~ (-type f -not -perms 0600) -or (-type d -not -perms 0700)
Однако поскольку круглые скобки имеют специальное значение для командной оболочки, их нужно экранировать, чтобы предотвратить интерпретацию скобок командной оболочкой. Для этого достаточно добавить обратный слеш перед каждой из них.
Логические операторы имеют еще одну важную особенность, с которой необходимо разобраться. Представьте, что у нас есть два выражения, разделенных логическим оператором:
выражение1 – оператор выражение2
Выражение1 будет вычислено в любом случае, а вот будет ли вычислено выражение2, зависит от оператора. В табл. 17.5 показано, как это работает.
Таблица 17.5. Действие логических операторов -and/-or команды find
Результат выражения1
Оператор
Выражение2...
Истина
– and
Всегда вычисляется
Ложь
– and
Никогда не вычисляется
Истина
– or
Никогда не вычисляется
Ложь
– or
Всегда вычисляется
Почему так происходит? Это сделано для повышения производительности. Возьмем для примера оператор -and. Мы знаем, что выражение выражение1 -and выражение2 не может быть истинным, если выражение1 вернет ложный результат, поэтому нет смысла вычислять выражение2. Аналогично, если имеется выражение выражение1 -or выражение2 и выражение1 вернет истинный результат, нет смысла вычислять выражение2, так как уже известно, что выражение1 -or выражение2 является истинным.