Обход и обработка файловых иерархий
Для обхода файловой иерархии и систематической обработки ее элементов служит утилита find:
find [-H | -L] файл ... [выражение]
Она рекурсивно обходит каждую из иерархий с корнями в заданных файлах (разумеется, обычно в этом качестве указываются каталоги), отыскивая файлы, которые удовлетворяют логическому выражению, построенному с помощью описанных ниже средств. Опции -H и -L стандартным образом влияют на трактовку символьных ссылок. Если указуемый файл не существует, find оперирует с самой ссылкой.
Перечислим элементарные логические выражения и правила их вычисления. (Далее n обозначает целое десятичное число; вместо него могут указываться также комбинации +n и -n, что означает, соответственно, "больше, чем n" и "меньше, чем n".)
-name шаблон_файлов
Истина, если имя текущего файла удовлетворяет шаблону_файлов. Символы шаблона, имеющие для shell специальный смысл, должны быть экранированы.
-type тип_файла
Истина, если файл имеет заданный тип: b, c, d, f, p или s - является, соответственно, блочным или символьным специальным файлом, каталогом, обычным файлом, каналом или сокетом.
-size n[c]
Истина, если файл занимает n блоков по 512 байт. Когда указана буква c, размер файла задается в символах. Напомним, что с помощью комбинаций +n и -n можно проверять размер (и три указанные ниже характеристики) не только на равенство, но и на неравенство.
-atime n
Истина, если последний доступ к файлу производился n дней назад (в данном контексте день - это промежуток времени в 86400 секунд).
-mtime n
Истина, если файл последний раз модифицировался n дней назад.
-ctime n
Истина, если атрибуты файла последний раз изменялись n дней назад.
-perm [-]режим
Истина, если режим файла соответствует заданному. При наличии знака минус соответствие понимается как включение (все заданные биты должны присутствовать в режиме доступа к файлу); если минус отсутствует, требуется точное совпадение. Режим задается аналогично утилите chmod.
-links n
Истина, если на файл имеется n жестких ссылок.
-user имя_пользователя
Истина, если владельцем файлаявляется заданный пользователь. Когда в качестве имени задано десятичное число и пользователя с таким именем нет, число трактуется как идентификатор пользователя.
-nouser
Истина, если идентификатор владельца файла отсутствует в базе данных пользователей.
-group владеющая_группа
Истина, если файлом владеет заданная группа.
-nogroup
Истина, если идентификатор владеющей группы файла отсутствует в базе данных групп.
-depth
Всегда истина; задает дисциплину обхода иерархии вглубь: сначала обрабатываются все элементы каталога, потом - сам каталог (по умолчанию find в первую очередь обрабатывает каталог и лишь после этого - его элементы).
-xdev
Всегда истина; предписывает не спускаться в каталоги, имеющие другой идентификатор устройства (st_dev, см. выше описание структуры stat).
-prune
Всегда истина; предписывает не обрабатывать текущий файл, если он является каталогом.
-exec команда
Истина, если после выполнения команды возвращается нулевой код завершения. запись команды должна заканчиваться экранированной точкой с запятой. Аргумент команды, заданный в виде пары фигурных скобок {}, заменяется маршрутным именем обрабатываемого файла.
-ok команда
Эквивалентно -exec за исключением того, что перед выполнением команды запрашивается подтверждение (в виде сгенерированной командной строки со знаком вопроса в конце), и она выполняется только при ответе y.
Всегда истина; вызывает выдачу маршрутного имени обрабатываемого файла на стандартный вывод. Если в командной строке find не задано выражение, то подразумевается -print. Если выражение не содержит ни -exec, ни -ok, ни -print, вместо него используется конструкция( выражение ) -print
-newer файл
Истина, если текущий файл был модифицирован позднее указанного файла
( выражение )
Истина, если истинно заключенное в скобки выражение (скобки должны быть экранированы от интерпретации языком shell).
Элементарные логические выражения могут комбинироваться с помощью следующих операций (в порядке уменьшения приоритета):
- унарная операция отрицания, обозначается !.
логическое И, обозначается пробелом или -a. Если значением первого операнда оказалась ложь, второй не вычисляется. Таким образом, последовательность разделенных пробелами выражений-операндов можно рассматривать как составной фильтр, через который пропускается текущий файл: если значением очередного операнда оказалась ложь, обработка прекращается; в противном случае файл передается следующему компоненту фильтра.
логическое ИЛИ, обозначается -o. Если значением первого операнда оказалась истина, второй не вычисляется.