[user]$ find /usr/share/doc /usr/doc /usr/locale/doc -name instr.txt
Началом "критерия_поиска", определяющего, что именно должна искать программа find, считается первый аргумент, начинающийся на "-", "(", ")"', "," или "!". Все аргументы, предшествующие "критерию_поиска", трактуются как имена каталогов, в которых надо производить поиск. Если не указано ни одного пути, поиск производится только в текущем каталоге и его подкаталогах.
Чаще всего поиск проводится по именам файлов, как это показано в предыдущем примере, т. е. "критерий_поиска" задается как "-name имя_файла". Вместо опции -name можно использовать опцию -path, тогда команда будет искать совпадения в полном имени файла, с указанием пути. Например, команда
[user]$ find. -path './sr*sc'
найдет в текущем каталоге подкаталог './src/misc'. Вместо полного имени файла или каталога в этом примере использован так называемый "шаблон имени". Поскольку шаблоны имен файлов могут использоваться не только с командой find, но и со многими другими командами (включая уже рассмотренные команды chmod, chown, chgrp, cp, rm, cat, mv), то правилам составления шаблонов стоит уделить некоторое внимание.
Чаще всего шаблоны имен файлов строятся с помощью специальных символов "*" и "?". Значок "*" используется для замены произвольной строки символов. В Linux
• "*" - соответствует всем файлам, за исключением скрытых;
• ".*" - соответствует всем скрытым файлам (но также текущему каталогу "." и каталогу уровнем выше "..": не забывайте об этом!);
• "*.*" - соответствует только тем файлам и каталогам, которые имеют "." в середине имени, или оканчиваются на точку;
• "p*r" - соответствует и "peter" и "piper";
• "*c*" - соответствует и "picked" и "peck".
Значок ? заменяет один произвольный символ, поэтому index?.htm будет соответствовать именам index0.htm, index5.htm и indexa.htm.
Кроме "*" и "?" в Linux при задании шаблонов имен можно использовать квадратные скобки [], в которых дается либо список возможных символов, либо интервал, в который должны попадать возможные символы. Например, [abc]* соответствует всем именам файлов, начинающимся с a, b, c; *[I-N1-3] соответствует файлам, имена которых оканчиваются на I, J, K, L, M, N, 1, 2, 3.
А теперь вернемся к команде find и расскажем подробнее о том, какие критерии поиска возможны. Несколько примеров простых критериев поиска перечислены в табл. 4.4.
Таблица 4.4. Критерии поиска для команды find.
Опция Значение -name шаблон Ищет файлы, имена которых соответствуют шаблону -group имя Ищет файлы, принадлежащие указанной группе -size число[c] Ищет файлы, размером в число 512-байтных блоков. Если после числа стоит символ c, значит размер указан в байтах (символах) -mtime число Ищет файлы, которые в последний раз изменялись указанное число дней назад -newer образец Ищет файлы, которые изменялись после изменения файла, указанного в образце -type тип_файла Ищет файлы указанного типа. Тип задается одним из символов b (блок-ориентированные устройства), c (байт-ориентированные устройства), d (файл каталога), f (обычный файл), p (именованный канал) либо l (символическая ссылка)Другие простые критерии вы можете узнать, если просмотрите man-страницу о команде find. Здесь же надо только сказать, что из простых критериев можно строить более сложные с помощью логических операций and, or или операции отрицания, знаком которой служит восклицательный знак. Например, если вы хотите найти все файлы, имена которых оканчиваются на.txt и.doc, то критерий можно записать как (-name*.txt -or -name*.doc). Можно комбинировать таким образом любое число критериев (и не только простых!). Если операция не указана явно, то подразумевается -and, т. е. вместо (-name*.txt -and -name*.doc) можно записать просто (-name*.txt -name*.doc). Если применяется только одна операция -and или !, то скобки обычно можно опустить, а с операцией -or и в сложных выражениях скобки необходимы. Перед скобкой нужно поставить обратную косую черту, а после скобки - пробел. Например, если вы хотите найти каталог по его имени, то можно сделать это командой
[user]$ find /usr -name doc -type d
или (с соблюдением правил построения сложных критериев)
[user]$ find /usr \(-name doc -and -type d \)
В следующем примере мы ищем файлы по такому критерию: либо имя файла оканчивается на*.tmp, либо размер файла больше 100 Кбайт.
[user]$ find /home/kos \(\(-name*.tmp \) -or \(-size +200 \) \)
В последнем примере стоит обратить внимание на то, что перед значением размера стоит знак "+". Такой знак можно использовать с любым числовым параметром в критериях поиска команды find. Он означает, что нужно искать файлы, у которых значение параметра больше заданного. Соответственно, знак "-" означает, что надо искать файлы, у которых значение параметра меньше заданного. Если знаки + или - отсутствует, ищутся файлы, у которых значение параметра равно заданному.