find - утилита для поиска файлов в иерархии директорий.
[SYNOPSIS]
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
[ОПИСАНИЕ]
Утилита GNU find осуществляет поиск по дереву директорий относительно каждой указанной стартовой точки (starting-point) путем оценки указанного выражения поиска (expression) слева направо, учитывая правила приоритета (см. секцию "ОПЕРАТОРЫ"). Поиск продолжается до тех пор, пока не будет известен результат выражения (левая сторона станет false для операций И, либо true для операций ИЛИ), после чего поиск переходит к следующему имени файла. Если не указана starting-point, то подразумевается '.' (текущая директория запуска find).
Если в используете find в окружении, где важно соблюдение безопасности (например, если поиск осуществляется по директориям, которые могут записываться другими пользователями), то следует прочитать главу 'Finding Files' документации 'Security Considerations' по findutils. Этот документ также включает некоторые полезные подробности по поиску, которые здесь не затронуты.
[ОПЦИИ]
Опции -H, -L и -P управляют обработкой символических ссылок. Следующие за ними аргументы командной строки считаются именами файлов или проверяемых директорий, вплоть до первого аргумента, начинающегося с '-', или аргумента '(' или '!'. Этот аргумент и любые последующие аргументы считаются выражением, которое описывает что искать. Если не указаны пути, то используется текущая директория. Если expression не предоставлено, то используется вместо него -print (однако вам вероятно следует в любом случае рассмотреть использование вместо этого -print0).
Это руководство (перевод документации man find) говорит про 'опции' внутри списка выражения expression. Эти опции управляют поведением поиска, однако они указываются непосредственно после последнего имени пути. Пять 'реальных' опций -H, -L, -P, -D и -O должны появляться перед первым именем, если эти опции используются. Двойное тире -- может теоретически использоваться для сигнала, что любые оставшиеся аргументы это не опции, но на самом деле это не работает из-за того, как find определяет конец следующих аргументов пути: он делает это, пока не встретится аргумент expression (который также начинается с '-'). Таким образом, если аргумент пути начинается с '-', то find вместо двойного тире вместо этого обработает это как аргумент expression. Поэтому для гарантии, что все стартовые точки будут приняты как таковые, и особенно для предотвращения ошибочного рассмотрения подстановочных шаблонов (wildcard), расширяемых шеллом, в качестве аргументов для expression, обычно безопаснее подстановочные знаки wildcard или сомнительные имена указывать либо через './', либо использовать полные имена путей, начинающиеся с корня '/'. Альтернативно как правило безопаснее (хотя это не портируемый вариант) использовать GNU-опцию -files0-from для передачи произвольных стартовых точек для поиска.
-P Не следовать символическим ссылкам. Это поведение по умолчанию. Когда find оценивает или печатает информацию о файлах, и файл это символическая ссылка, используемая информация должна быть взята из самой символической ссылки.
-L Следовать символическим ссылкам. Когда find оценивает или печатает информацию по файлам, эта информация должна быть взята из файла, на который указывает ссылка, но не из самой ссылки (за исключением ситуации, когда это поврежденная символическая ссылка, либо find не может проверить файл, на который ссылка указывает). Использование этой опции подразумевает -noleaf. Если вы позже используете опцию -P, то -noleaf останется действующей. Если действует -L, и find определить символическую ссылку на подкаталог, то будет выполнен поиск подкаталога, на который указывает символическая ссылка.
Когда действует опция -L, предикат -type всегда будет соответствовать типу файла, на который указывает символическая ссылка, вместо самой символической ссылки (за исключением ситуации поврежденной символической ссылки)). Действия, которые могут привести к поврежденной символической ссылке, когда выполняется find (например -delete), могут привести к запутанному поведению. При использовании -L предикаты -lname и -ilname всегда возвратят false.
-H Не следовать символическим ссылкам, кроме как при обработке аргументов командной строки. Когда find оценивает или печатает информацию по файлам, то должна использоваться информация, взятая из самой символической ссылки. Единственным исключением является случай, когда файл, указанный в командной строке, является символьной ссылкой, и эта ссылка может быть разрешена. Для такой ситуации берется информация оттуда, на что указывает символическая ссылка (т. е. происходит следование по ссылке). Информация по самой ссылке используется как запасной вариант, если файл, на который ссылка указывает, не может быть проверен. Если действует опция -H, и один из путей, указанных в командной строке, является символической ссылкой на каталог, то будет проверяться содержимое этой директории (хотя конечно -maxdepth 0 предотвратит это).
Если указано больше одной опции -H, -L и -P, то каждая отменяет действие предыдущей; т. е. вступает в действие та из них, которая появилась в командной строке последней. Поскольку опция -P действует по умолчанию, то она считается активной, если не указана либо -H, либо -L.
GNU find часто устанавливает файлы во время обработки самой командной строки, до начала поиска. Эти опции также влияют на то, как эти аргументы обрабатываются. В частности, существует ряд тестов, которые сравнивают файлы, перечисленные в командной строке с файлом, который мы сейчас рассматриваем. В каждом случае указанный в командной строке файл будет проверен, и некоторые его свойства будут сохранены. Если именованный файл на самом деле является символьной ссылкой, и действует опция -P (или если не указаны ни опция -H, ни опция -L), будет взята информация для сравнения из свойств символической ссылки. Иначе информация будет взята из файла, на который указывает ссылка. Если find не сможет проследовать по ссылке (из-за недостаточных привилегий доступа или если ссылка указывает на несуществующий файл), то будут использованы свойства самой ссылки.
Когда действует опция -H или -L, любые символические ссылки, указанные в качестве аргумента, не будут разрешены (-newer), и будет взята метка времени из файла, на который указывает символьная ссылка. То же самое применяется для -newerXY, -anewer и -cnewer.
Опция -follow дает эффект подобный -L, хотя это дает эффект и в точке появления (т. е. если не используется -L, но -follow используется, то будут разрешаться символические ссылки, которые появились в командной строке после -follow, а те которые появились до, разрешаться не будут).
-D debugopts
Печатает диагностическую информацию; это полезно для диагностики проблем, когда вы хотите понять, почему find не делает то, что вы хотите. В списке опций отладки debugopts опции отделяются друг от друга запятыми. Не гарантируется совместимость опций отладки между релизами findutils. Для полного списка допустимых опций отладки см. вывод команды find -D help. Допустимые опции отладки включают:
exec Покажет диагностическую информацию, связанную с -exec, -execdir, -ok и -okdir.
opt Напечатает диагностическую информацию, относящуюся к оптимизации дерева выражения (expression); см. опцию -O.
rates Напечатает суммарную информацию, показывающую, как часто каждый предикат был успешен или потерпел сбой.
search Подробная навигация дерева директории.
stat Печатает сообщения, как файлы проверяются системными вызовами stat и lstat. Программа find пытается минимизировать такие вызовы.
tree Покажет дерево выражения (expression tree) в своей оригинальной и оптимизированной форме.
all Разрешит все другие опции отладки (кроме help).
help Объяснит опции отладки.
-Olevel
Разрешает оптимизацию запроса. Программа find переупорядочивает тесты для ускорения выполнения, с сохранением эффекта общего результата; т. е. предикаты с побочными эффектами не переупорядочиваются друг относительно друга. Выполняются следующие оптимизации для каждого уровня.
0 Эквивалентно уровню оптимизации 1.
1 Это уровень оптимизации по умолчанию, соответствующий традиционному поведению. Выражения переупорядочиваются таким образом, чтобы сначала выполнялись тесты, основанные на именах файлов (например -name и -regex).
2 Любые тесты -type или -xtype выполняются после тестов, основанных только на именах файлов, но перед любыми тестами, которые требуют информации от inode. На многих современных версиях Unix типы файлов возвращаются из readdir(), так что эти предикаты вычисляются быстрее, чем предикаты, которые сначала должны установить файл. Если вы используете предикат -fstype FOO, и укажете тип файловой системы FOO, который неизвестен (т. е. присутствует в '/etc/mtab') в момент начала поиска, этот предикат эквивалентен -false.
3 На этом уровне оптимизации разрешается оптимизатор запросов на основе полной стоимости. Порядок тестов модифицируется таким образом, что сначала выполняются дешевые (т. е. быстрые) тесты, а более дорогие позже, если это необходимо. В каждом диапазоне затрат предикаты оцениваются раньше или позже в зависимости от того, могут они быть успешными, или нет. Для оператора -o те предикаты, которые скорее всего успешны, вычисляются раньше, и для оператора -a предикаты которых скорее всего потерпят отказ, вычисляются раньше.
Оптимизатор на основе затрат имеет фиксированное представление о том, насколько вероятно, что любой данный тест будет успешным. В некоторых случаях вероятность учитывает специфический характер теста (например -type f подразумевается более успешным, чем -type c). Оптимизатор на основе затрат в настоящее время оценивается. Если это фактически не улучшит производительность поиска, то он снова будет удален. И наоборот та оптимизация которая оказалась надежной и эффективной, с течением времени может быть реализована на более низких уровнях оптимизации. Однако поведение по умолчанию (т. е. уровень оптимизации 1) не будет изменено в серии версий 4.3.x. Набор тестов findutils запускает все тесты с find на каждом уровне оптимизации, с гарантией, что результат окажется одинаковый.
[EXPRESSION (выражение)]
Часть командной строки после списка стартовых точек это выражение поиска (expression). Это своего рода спецификация запроса, которая описывает, как мы сопоставляем файлы и что мы делаем с совпавшими файлами. Выражение состоит из последовательности следующих вещей:
Tests
Тесты возвратят значение true или false, обычно основываясь на некотором свойстве файла, который мы рассматриваем. Например тест -empty равен true только когда текущий файл пустой.
Actions
Actions (действия) дают побочные эффекты (такие как печать чего-нибудь в стандартный вывод), и возвращают true либо false, обычно основываясь на том, было ли действие успешным или нет. Например действие -print печатает имея текущего файла в стандартный вывод.
Глобальные опции
Глобальные опции влияют на работу tests и actions, указанных в любой части командной строки. Глобальные опции всегда возвратят true. Например опция -depth позволяет find делать проход по файловой системы в порядке глубины.
Позиционные опции
Позиционные опции влияют только на tests или actions, которые следуют за ними. Позиционные опции всегда возвратят true. Например опция -regextype позиционная, с указанием диалекта регулярного выражения для того выражения, которое позже идет в командной строке.
Operators
Операторы соединяют друг с другом другие элементы выражения. Например они включают -o (что означает logical OR, логическое ИЛИ) и -a (что означает logical AND, логическое И). Там где оператор отсутствует, подразумевается -a.
Действие -print выполняется на всех файлах, для которых все выражение вычислено как true, если оно не содержит действия, отличного от -prune или -quit. Действия, которые запрещают умолчание -print, это -delete, -exec, -execdir, -ok, -okdir, -fls, -fprint, -fprintf, -ls, -print и -printf.
Действие -delete также работает наподобие опции (поскольку подразумевает -depth).
[ПОЗИЦИОННЫЕ ОПЦИИ]
Позиционные опции всегда возвращают true. Они влияют только на тесты, которые идут в командной строке позже.
-daystart
Времена измерения (для -amin, -atime, -cmin, -ctime, -mmin и -mtime) от начала сегодняшнего дня вместо того, чтобы использовать время 24 часа назад. Эта опция влияет только на тесты, которые появляются позже в командной строке.
-follow
Устарела; используйте вместо неё -L. Разыменование символических ссылок. Подразумевает -noleaf. Опция -follow влияет только на то, что идет за ней в командной строке. Если не указана опция -H или -L, то положение опции -follow меняет поведение предиката -newer; любые файлы, перечисленные в качестве аргумента -newer, будут разыменованы, если это символические ссылки. То же самое применяется к -newerXY, -anewer и -cnewer. Подобным образом, предикат -type всегда будет соответствовать типу файла, на который указывает символическая ссылка, вместо самой ссылки. Использование -follow приводит к тому, что предикаты -lname и -ilname всегда возвратят false.
-regextype type
Меняет тип синтаксиса регулярных выражений, который понимают тесты -regex и -iregex, появляющиеся позже в командной строке. Чтобы увидеть, какие есть известные типы регулярных выражений, используйте -regextype help. Документация Texinfo (см. далее "СМ. ТАКЖЕ") объясняет смысл и различия между различными типами регулярных выражений.
-warn, -nowarn
Включает или выключает предупреждающие сообщения (warning). Эти предупреждения применяются только к использованию командной строки, но не к любым условиям, которые могут встретиться при поиске по директориям. Поведение по умолчанию соответствует -warn, если стандартный ввод это tty, иначе по умолчанию применяется -nowarn. Если было выведено предупреждающее сообщение, относящееся к командной строке, то на статус выхода это не влияет. Если установлена переменная окружения POSIXLY_CORRECT, и также использовалась -warn, то не указано, какие предупреждения активны, если они были.
[ГЛОБАЛЬНЫЕ ОПЦИИ]
Глобальные опции всегда возвратят true. Глобальные опции вступают в действие даже для тех тестов, которые появились в командной строке раньше. Чтобы избежать путаницы, глобальные опции должны указываться в командной строке после списка стартовых точек, сразу перед первым тестом, позиционной опции или действием (action). Если вы укажете глобальную опцию где-нибудь в другом месте, то find выдаст предупреждающее сообщение, объясняющее, что такое использование глобальной опции может привести к путанице.
Глобальные опции появляются после списка стартовых точек, и это опции не того же самого типа, как например, -L.
-d
Синоним для -depth, сделано для совместимости с FreeBSD, NetBSD, MacOS X и OpenBSD.
-depth
Обрабатывает содержимое каждой директории перед самой директорией. Действие -delete также подразумевает -depth.
-files0-from file
Чтение стартовых точек из файла вместо извлечения их из командной строки. В отличие от известных ограничений передачи стартовых точек через аргументы в командной строке, а именно ограничение количества имен файлов, и присущей неоднозначности конфликтов имен файлов с именами опций, использование этой опции позволяет безопасно передавать произвольное количество стартовых точек для поиска.
Использование этой опции и передача стартовых точек в командной строке исключают друг друга, и это нельзя использовать одновременно.
Аргумент файла file обязателен. Вместо него можно использовать дефис (-files0-from -), чтобы читать список стартовых точек из потока стандартного ввода, и например из канала (pipe). В этом случае действия -ok и -okdir не позволяются, потому что они очевидно мешали бы чтению из стандартного ввода, чтобы получить подтверждение пользователя.
Стартовые точки в файле должны быть разделены символами ASCII NUL. Два непосредственно идущие друг за другом символа NUL, т. е. имя файла нулевой длины не допускаются, и это приведет к диагностике ошибки и последующему ненулевому коду возврата.
В случае, когда указанный файл пуст, find не обрабатывает какие-либо стартовые точки, и поэтому немедленно выполнит выход сразу после парсинга аргументов программы. Это поведение отличается от стандартного запуска, когда не указаны стартовые точки, что подразумевает текущую директорию в качестве стартовой точки, если не задан аргумент пути.
Иначе препроцессинг стартовых точек происходит как обычно, т. е. find будет рекурсивно обрабатывать подкаталоги, если это не запрещено явно. Чтобы обработать только стартовые точки (без захода в подкаталоги), можно дополнительно передать -maxdepth 0.
Дополнительные замечания: если файл указан во входном файле более одного раза, то не уточняется, посещается ли он более одного раза. Если файл мутировал во время работы find, то результат также не указывается. И наконец, позиция поиска в именованном файле на момент выхода из find, когда выход произошел из-за -quit или по любой другой причине, также не определена. Под "позиция поиска не определена" здесь подразумевается, что поведение в этот момент не может работать необязательно каким-то строго определенным образом и может меняться от платформе к платформе, или от одного релиза findutils к другому.
-help, --help
Напечатает общую подсказку по командной строке.
-ignore_readdir_race
Обычно find выдает сообщение об ошибке, когда не может установить файл. Если вы предоставили эту опцию, и файл был удален между моментом, когда find считала имя файл из директории и моментом, когда find пытается запустить файл, то сообщение об ошибке не выдается. Это также применяется к файлам или директориям, имена которых были предоставлены в командной строке. Эта опция вступает в силу, когда считывается командная строка, и это значит, что вы не можете искать одну часть файловой системы с этой опцией активной и её часть с этой опцией не активной (если вам необходимо что-то подобное, то вместо этого запустите две команды find, у одной с этой опцией, а у другой без неё).
Кроме того, find с опцией -ignore_readdir_race будет игнорировать ошибки действия -delete в случае, когда файл исчез после момента, когда была прочитана родительская директория: диагностическое сообщение об ошибке не будет выведено, и код возврата действия -delete будет true.
-maxdepth levels
Просматривать как минимум levels (не отрицательное целое число) уровней вложенности директорий от стартовых точек. Использование -maxdepth 0 означает, что тесты и действия применимы только к самим стартовым точкам.
-mindepth levels
Не применять какие-либо тесты или действия на уровнях вложенности директорий меньше, чем значение levels (не отрицательное целое число). Использование -mindepth 1 означает обрабатывать все файлы, кроме стартовых точек.
-mount
Не спускаться в другие файловые системы. Это альтернативное имя для -xdev, для совместимости с другими версиями find.
-noignore_readdir_race
Отключает действие -ignore_readdir_race.
-noleaf
Не выполнять оптимизацию в предположении, что директории содержат на 2 подкаталога меньше, чем количество их жестких ссылок (hard links). Эта опция нужна для поиска по файловым системам, которые не соответствуют Unix-соглашению директория-ссылка (directory-link convention), таких как файловые системы CD-ROM или MS-DOS, или точки монтирования тома AFS. Каждая директория в нормальной файловой системе Unix имеет как минимум 2 жесткие ссылки: её имя и запись '.' entry. Дополнительно её подкаталоги (если они есть) каждый имеет запись '..', связанную с этой директорией. Когда find проверяет директорию, после установки менее 2 субдиректорий, чем количество ссылок этой директории, find знает, что остальные элементы в директории это не директории ('leaf' файлы, т. е. 'листочки' дерева директории). Если нужно проверять только имена файлов, то нет необходимости их устанавливать; это значительно ускоряет поиск.
-version, --version
Напечатает версию find.
-xdev
Не спускаться в директории других файловых систем.
[TESTS (тесты)]
Некоторые тесты, например -newerXY и -samefile, позволяют выполнять сравнение между проверяемым в настоящий момент файлом и некоторым образцовым файлом, указанном в командной строке. Когда используются такие тесты, интерпретация образцового файла определяется опциями -H, -L и -P, а также любыми предыдущими -follow, однако образцовый файл оценивается однократно, в момент парсинга командной строки. Если образцовый файл не может быть проверен (например, системный вызов stat(2) потерпел с этим неудачу), то будет выдано сообщение об ошибке, и find завершит работу с ненулевым статусом возврата.
Числовой аргумент n может быть указан для тестов (наподобие -amin, -mtime, -gid, -inum, -links, -size, -uid и -used):
+n для больше чем n, -n для меньше чем n, n для точного n.
Поддерживаются тесты:
-amin n
К файлу осуществлялся доступ меньше чем, больше чем или точно n минут назад.
-anewer reference
Время последнего доступа к текущему файлу более свежее, чем время последней модификации данных образцового файла. Если образец это символическая ссылка, и действует опция -H или опция -L, то всегда используется время последней модификации файла, на который указывает ссылка.
-atime n
Последний доступ к файлу был менее, более или точно n*24 часов назад. Когда find выяснит, сколько 24-часовых периодов тому назад был доступ к файлу, любая дробная часть таких периодов игнорируется, поэтому для соответствия -atime +1 к файлу должен осуществляться доступ как минимум 2 дня назад.
-cmin n
Статус файла поменялся меньше чем, больше чем или точно n минут назад.
-cnewer reference
Время последнего изменения статуса текущего файла более свежее, чем время последней модификации данных образцового файла. Если образец это символическая ссылка, и действует опция -H или опция -L, то всегда используется время последней модификации файла, на который указывает ссылка.
-ctime n
Последний доступ к файлу был менее, более или точно n*24 часов назад. См. комментарий для -atime для понимания, какой действует эффект округления для интерпретации времени изменения статуса файла.
-empty
Файл пустой, и является обычным файлом или каталогом.
-executable
Сопоставляет исполняемые файлы и директории, доступные для поиска (в смысле разрешения имен файлов) текущим пользователем. Это учитывает списки управления доступом (access control lists) и другие артефакты разрешений, которые игнорирует тест -perm. Этот тест использует системный вызов access(2), и поэтому может быть обманут серверами NFS, которые выполняют отображение универсальных идентификаторов, UID mapping (или root-squashing), поскольку многие системы реализуют access(2) в клиентском ядре, и таким образом не могут использовать информацию UID mapping, содержащуюся на сервере. По той причине, что этот тест основывается только на результате системного вызова access(2), нет никакой гарантии, что файл, для которого этот тест успешен, действительно может быть выполняемым.
-false
Всегда false.
-fstype type
Файл находится в файловой системе типа type. Допустимые типы файловой системы зависят от версий Unix; неполный список файловых систем, принимаемых на той или иной версии Unix следующий: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. Вы можете использовать -printf с директивой %F, чтобы увидеть типы ваших поддерживаемых файловых систем.
-gid n
Числовой идентификатор группы файла (group ID) меньше, больше или точно n.
-group gname
Файл принадлежит группе gname (допускаются цифровые group ID).
-ilname pattern
Работает наподобие -lname, но соответствие срабатывает без обращения внимания на регистр символов. Если действует опция -L или -follow, то этот тест вернет false, если символическая ссылка не нарушена.
-iname pattern
Работает наподобие -name, но соответствие не обращает внимания на регистр символов. Например, шаблоны 'fo*' и 'F??' совпадут с именами 'Foo', 'FOO', 'foo', 'fOo', и т. п. Шаблон '*foo*' также совпадет с файлом '.foobar'.
-inum n
У файла номер inode меньше, больше или точно n. Как правило, проще использовать тест -samefile.
-ipath pattern
Работает наподобие -path, но соответствие не обращает внимание на регистр символов.
-iregex pattern
Работает наподобие -regex, но соответствие не обращает внимание на регистр символов.
-iwholename pattern
См. -ipath. Эта альтернатива менее портируемая, чем -ipath.
-links n
У файла меньше больше или точно n жестких ссылок (hard links).
-lname pattern
Файл это символическая ссылка, содержимое которой соответствует шаблону шелла pattern. Метасимволы специально не относятся к '/' или '.'. Если действует опция -L или -follow, то этот тест вернет false, если символическая ссылка не нарушена.
-mmin n
Данные файла были последний раз модифицированы меньше, больше или точно n минут назад.
-mtime n
Данные файла были последний раз модифицированы меньше, больше или точно n*24 часов назад. См. комментарий к -atime для понимания, как округление влияет на интерпретацию времен модификации файла.
-name pattern
Базовое имя файла (т. е. путь без начальных директорий) соответствует шаблону шелла pattern. Потому что начальные директории из имен файлов были удалены, в шаблоне не должно содержаться слеша, так как '-name a/b' никогда не совпадет с чем-либо (и возможно вы захотите использовать вместо этого -path). Исключение для этого составляет случай, когда используется слеш в качестве шаблона ('-name /'), потому что это допустимая строка, соответствующая корневой директории (root directory "/"), так как базовое имя для "/" это "/". Будет выдано предупреждение, если вы попытаетесь передать шаблон, содержащий -, но не состоящий исключительно из одного слеша, если не установлена переменная окружения POSIXLY_CORRECT или не используется опция -nowarn.
Чтобы игнорировать директорию и файлы под ней, используйте -prune вместо проверки каждого файла в дереве; см. пример в описании для такого действия. Скобки не распознаются как спецсимволы несмотря на то, что некоторые шеллы, включая Bash imbue, дают этому особое значение в своих шаблонах (shell patterns). Сопоставление имени файла выполняется с использованием библиотечной функции fnmatch(3). Не забудьте заключить шаблон в кавычки, чтобы защитить его расширение шеллом.
-newer reference
Время последней модификации данных текущего файла более свежее, чем время последней модификации данных образцового файла. Если образец это символическая ссылка, и действует опция -H или опция -L, то всегда используется время последней модификации данных файла, на который указывает ссылка.
-newerXY reference
Успешный результат, если метка времени X файла определена более новой, чем метка времени Y файла образца reference. Буквы X и Y могут быть следующими буквами:
a Время доступа к файлу образца. B Время рождения файла образца. c Время изменения статуса inode файла образца. m Время модификации файла образца. t Образец интерпретируется напрямую как время.
Некоторые комбинации недопустимы; например, недопустима t для X. Некоторые комбинации не реализованы на всех системах; например, B поддерживается не на всех системах. Если указана недопустимая или неподдерживаемая комбинация XY, то это приведет к фатальной ошибке. Спецификации времени интерпретируются как аргумент даты GNU опции -d. Если вы попытаетесь использовать время рождения файла образца (reference file), и это время не может быть определено, то это приведет к сообщению о фатальной ошибке. Если вы укажете тест, который ссылается на время рождения проверяемых файлов, то этот тест потерпит неудачу для любых файлов, у которых время создания неизвестно.
-nogroup
Ни одна из групп не соответствует цифровому идентификатору группы (group ID) файла.
-nouser
Ни один пользователь не соответствует цифровому идентификатору пользователя (user ID) файла.
-path pattern
Имена файлов соответствуют шаблону шелла pattern. Метасимволы '/' или '.' не обрабатываются специальным образом; так например,
find . -path "./sr*sc"
напечатает элемент директории с именем ./src/misc (если он существует). Чтобы игнорировать все дерево директории, используйте -prune вместо того, чтобы проверять каждый файл в дереве. Обратите внимание, что тест совпадения pattern применяется ко всему имени файла, начиная от одной из стартовых точек командной строки. Здесь имеет смысл использовать имя абсолютного пути только в том случае, если соответствующая начальная точка также является абсолютным путем. Т. е. следующей команде ничего не будет соответствовать:
find bar -path /foo/bar/myfile -print
Утилита find сравнивает аргумент -path с результатом слияния имени директории и базового имени проверяемого файла. Поскольку это слияние никогда не заканчивается слешем, то аргументы -path, заканчивающиеся слешем, ничему не будут соответствовать (за исключением, возможно, начальной точки, указанной в командной строке). Предикат -path также поддерживается утилитой find операционной системы HP-UX и является частью стандарта POSIX 2008.
-perm mode
Биты разрешений файла точно соответствуют mode (в восьмеричной или символьной форме). Поскольку требуется полное совпадение, то если вы хотите использовать эту форму для символических mode, вам возможно придется указать вместо этого довольно сложную строку mode. Например '-perm g=w' совпадет только с файлами, у которых mode 0020 (т. е. с теми, для которых разрешения записи группы являются единственным набором разрешений). Более вероятно, что вы захотите использовать формы '/' или '-' например '-perm -g=w', что соответствует любому файлу с разрешением на запись в группу. См. секцию "ПРИМЕРЫ" для некоторых более иллюстративных примеров.
-perm -mode
Для файла установлены все биты разрешений mode. В этой форме принимаются символически указанный mode, и это обычный способ использования. Вы должны указать 'u', 'g' или 'o', если используете символьный mode. См. секцию "ПРИМЕРЫ" для некоторых более иллюстративных примеров.
-perm /mode
Для файла установлены любые биты разрешений mode. В этой форме принимаются символически указанный mode. Вы должны указать 'u', 'g' или 'o', если используете символьный mode. См. секцию "ПРИМЕРЫ" для некоторых более иллюстративных примеров. Если не установлен ни один бит разрешения в mode, то этот тест будет соответствовать любому файлу (здесь идея должна соответствовать -perm -000).
-perm +mode
Это больше не поддерживается (и стало устаревшим с 2005 года). Используйте вместо этого -perm /mode.
-readable
Соответствует файлам, которые читаемы для текущего пользователя. Это учитывает биты контроля доступом и другие артефакты разрешений, которые игнорирует тест -perm. Этот тест использует системный вызов access(2), так что может обмануть серверы NFS, которые выполняют отображение универсальных идентификаторов пользователя UID mapping (или root-squashing), поскольку многие системы реализуют access(2) в ядре клиента и поэтому не могут использовать информацию UID mapping, хранящуюся на сервере.
-regex pattern
Имя файла соответствует регулярному выражению pattern. Это совпадение по всему пути, а не поиск. Например, чтобы совпал файл с именем ./fubar3, вы можете указать регулярное выражение '.*bar.' или '.*b.*3', но не 'f.*r3'. Регулярные выражения, которые понимает find, по умолчанию используют диалект Emacs Regular Expressions (за исключением того, что '.' соответствует новой строке), однако это можно поменять опцией -regextype.
-samefile name
Файл ссылается на тот же inode, что и name. Когда действует опция -L, это может включать символические ссылки.
-size n[cwbkMG]
Файл использует менее чем, более чем или точно n единиц пространства, округленные вверх. Могут использоваться следующие суффиксы:
'b' для 512-байтных блоковs (это используется по умолчанию, если суффикс не указан). 'c' для байт. 'w' для 2-байтных слов. 'k' для кибибайт (KiB, единицы по 1024 байт). 'M' для мебибайт (MiB, единицы по 1024 * 1024 = 1048576 байт). 'G' для гибибайт (GiB, единицы по 1024 * 1024 * 1024 = 1073741824 байт).
Здесь размер это просто поле st_size структуры stat, заполняемой системным вызовом lstat (или stat), округленное вверх, как показано выше. Другими словами, это согласуется с результатом, который вы получаете для ls -l. Учите, что спецификаторы формата '%k' и '%b' опции -printf по-разному обрабатывают разреженные файлы. Суффикс 'b' всегда обозначает 512-байтные блоки, и никогда 1024-байтные блоки, что отличается от поведения -ls.
Префиксы + и - обозначают больше чем и меньше чем, как обычно; например, точный размер в n единиц не совпадет. Учтите, что размер округляется вверх до следующей целой единицы. Таким образом, -size -1M не эквивалентно -size -1048576c. Первое соответствует только пустым файлам, второе файлам размером от 0 до 1048575 байт.
-true
Всегда true.
-type c
Файл типа c:
b Специальный типа block (с буферизацией). c Специальный символьный (без буферизации). d Директория. p Именованный канал (named pipe, FIFO). f Обычный файл. l Символическая ссылка (symbolic link); это никогда не true, если действует опция -L или опция -follow, кроме ситуации, когда символическая ссылка повреждена. Если вы хотите искать символические ссылки, когда действует -L, то используйте -xtype.
s Сокет (socket). D door (Solaris).
Чтобы искать за один раз более одного типа, то вы можете просто скомбинировать типы в список, отделяя их запятой ',' (расширение GNU).
-uid n
Числовой идентификатор пользователя файла (user ID) меньше чем, больше чем или точно n.
-used n
К файлу был последний раз доступ меньше чем, больше чем или точно n дней после того, как последний его статус был изменен.
-user uname
Файлом владеет пользователь uname (разрешены числовые user ID).
-wholename pattern
См. -path. Эта альтернатива менее портируема, чем -path.
-writable
Соответствует файлам, которые записываемы для текущего пользователя. Это учитывает биты контроля доступом и другие артефакты разрешений, которые игнорирует тест -perm. Этот тест использует системный вызов access(2), так что может обмануть серверы NFS, которые выполняют отображение универсальных идентификаторов пользователя UID mapping (или root-squashing), поскольку многие системы реализуют access(2) в ядре клиента и поэтому не могут использовать информацию UID mapping, хранящуюся на сервере.
-xtype c
То же самое, что и -type, за исключением того, что файл это символическая ссылка. Для символических ссылок: если была указана опция -H или -P, то true, если файл это ссылка на файл типа c; если была указана опция -L, то true, если c это 'l'. Другими словами, для символических ссылок -xtype проверяет тип файла, который не проверяет -type.
-context pattern
Контекст безопасности (только на SELinux) файла совпадает с глобальным шаблоном pattern.
[ACTIONS (действия)]
-delete
Удаляет файлы или директории; true, если удаление было успешным. Если удаление потерпело неудачу, то выдается сообщение об ошибке, и статус выхода find будет ненулевой (когда произошел выход).
Предупреждение: не забудьте, что find оценивает командную строку как выражение, так что если указать -delete первым, то это приведет к тому, что find попытается удалить все что указано ниже стартовых точек.
Использование действия -delete в командной строке автоматически включает опцию -depth. В свою очередь -depth делает опцию -prune неэффективной, так что действие -delete нельзя с пользой комбинировать с -prune.
Часто пользователь может захотеть протестировать командную строку find путем добавления -print перед добавлением -delete в реальной запускаемой команде удаления. Чтобы избежать сюрпризов, обычно лучше не забывать явно использовать -depth во время этих более ранних тестовых запусков.
Действие -delete потерпит неудачу при удалении директории, если она не пустая.
Вместе с опцией -ignore_readdir_race утилита find будет игнорировать ошибки действия -delete в случае, когда файл пропал с момента, когда произошло чтение родительской директории: не будет выведено диагностическое сообщение об ошибке, не поменяется на ненулевой код выхода, и будет true код возврата действия -delete.
-exec command ;
Выполнит команду command; true, если в результате возвращается статус 0. Все последующие аргументы find считаются аргументами command до тех пор, пока не попадется аргумент, состоящий из ';'. Строка '{}' заменяется текущим именем файла, обрабатываемым везде, где она появляется в аргументах для command, а не только в аргументах, где она одна, как в некоторых версиях find. Для обоих этих конструкций может понадобиться экранирование (с помощью '\') или обрамление кавычками, чтобы защитить их от расширения шеллом. См. секцию "ПРИМЕРЫ" для примеров использования опции -exec. Указанная для запуска команда command запускается по одному разу для каждого найденного файла. При этом command выполняется в стартовой директории. Здесь есть неизбежные проблемы безопасности, связанные с действием -exec; вместо этого следует использовать опцию -execdir.
-exec command {} +
Этот вариант действия -exec запустит указанную команду command на выбранных файлах, однако командная строка строится путем добавления каждого выбранного имени файла в конце; общее количество запусков command будет намного меньше, чем количество совпавших файлов. Командная строка строится почти так же, как xargs строит строки команд. В команде command разрешается только одно вхождение '{}', и оно должно появляться в конце, сразу перед '+'; это должно быть экранировано (с помощью '\') или заключено в кавычки, чтобы защитить от интерпретации шеллом. Команда command выполняется в стартовой директории. Если любой запуск в форме с '+' вернет ненулевое значение статуса, то find также вернет ненулевой статус. Если find встретилась с ошибкой, то это может иногда привести к немедленному выходу, так что некоторые ожидающие запуска команды могут не выполниться вообще. По этой причине -exec my-command ... {} + -quit может не привести к тому, что my-command на самом деле запустится. Этот вариант -exec всегда возвратит true.
-execdir command ; -execdir command {} +
Работает подобно -exec, но указанная команда выполняется из директории, содержащей совпавший файл, и эта директория совсем не обязательно должна быть той, из которой была запущена программа find. Как и в случае -exec, строка {} должна быть экранирована, если find запускается из шелла. Таким образом, это более безопасный метод запуска команд command, поскольку позволяет избегать ситуаций гонки (race conditions) во время разрешения путей к совпавшим файлам. Как с действием -exec, форма '+' действия -execdir будет строить командную строку для обработки более одного совпавшего файла, но любой данный вызов command будет только перечислять файлы, которые содержатся в одной и той же директории. Если вы используете эту опцию, то должны убедиться, что ваша переменная окружения PATH не ссылается на '.'; иначе атакующий может запустить любые команды, какие захочет, оставив файл с соответствующим именем в директории, откуда вы будете запускать -execdir. То же самое применимо к записям PATH, которые являются пустыми, или которые не являются абсолютными именами директорий. Если любой запуск формы '+' вернет ненулевое значение статуса выхода, то find вернет ненулевой статус на выходе. Если find встретилась с ошибкой, то это может иногда привести к немедленному выходу, так что некоторые ожидающие запуска команды могут не выполниться вообще. Результат действия зависит от того, какой вариант использовался '+' или ';'; -execdir command {} + всегда вернет true, в то время как -execdir command {} ; вернет true только если command вернет 0.
-fls file
True; работает наподобие -ls, но запись происходит в файл, как -fprint. Выходной файл создается всегда, даже если предикат никогда не совпадает. См. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-fprint file
True; печатает полное имя файла в файл file. Если файл не существует, то find при запуске создаст его; если файл существует, то он обрезается. Имена файлов /dev/stdout и /dev/stderr обрабатываются специальным образом; они относятся к стандартному выводу и стандартному выводу ошибок соответственно. Выходной файл создается всегда, даже если предикат никогда не совпадает. См. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-fprint0 file
True; работает наподобие -print0 но пишет в файл как -fprint. Выходной файл создается всегда, даже если предикат никогда не совпадает. См. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-fprintf file format
True; работает наподобие -printf но пишет в файл как -fprint. Выходной файл создается всегда, даже если предикат никогда не совпадает. См. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-ls
True; перечисляет текущий файл в формате ls -dils на стандартном выводе. Счетчик блоков учитывает 1 KB блоки, если не установлена переменная окружения POSIXLY_CORRECT, в этом случае используются 512-байтные блоки. См. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-ok command ;
Работает наподобие -exec, однако сначала запрашивает подтверждение пользователя. Если пользователь соглашается, то будет запущена команда command. Иначе просто возвращается false. Если команда запущена, то её стандартный ввод перенаправляется из /dev/null. Это действие не может указано вместе с опцией -files0-from.
Ответ на промт сопоставляется с парой регулярных выражений, чтобы определить, какой был ответ пользователя - подтверждение или отказ. Это регулярное выражение берется из системы, если установлена переменная окружения POSIXLY_CORRECT, либо иначе из трансляций сообщения find. Если у системы нет подходящего определения, то find будет использовать свое собственное определение. В любом случае на интерпретацию самого регулярного выражения будут влиять переменные окружения LC_CTYPE (классы символов) и LC_COLLATE (диапазоны символов и классы эквивалентности).
-okdir command ;
Работает наподобие -execdir, однако сначала запрашивает подтверждение пользователя таким же образом, как -ok. Если пользователь не дал подтверждение, то просто вернет false. Если команда command запущена, то её стандартный ввод перенаправляется из /dev/null. Это действие не может быть указано вместе с опцией -files0-from.
-print
True; печатает полное имя файла в стандартный вывод, за которым идет новая строка. Если вы перенаправляете (piping) вывод в другую программу, и есть самая слабая возможность, что имя файлов, которые вы ищете, может содержать новую строку, то следует серьезно рассмотреть возможность использования опции -print0 вместо -print. См. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-print0
True; печатает полное имя файла в стандартный вывод, за которым идет символ null (вместо символа новой строки, как при использовании -print). Это позволяет именам файлов содержать символы новой строки или другие типы пробелов, чтобы это корректно интерпретировали программы, обрабатывающие вывод find. Эта опция соответствует опции -0 для xargs.
-printf format
True; форматированная печать в стандартный вывод, с интерпретацией экранирования '\' и директив '%'. Поля ширины (width) и точности (precision) может быть указано так же, как с функцией printf(3) языка C. Обратите внимание, что многие поля печатаются как %s вместо %d, и это может означать, что флаги не работают так, как вы можете ожидать. Это также означает, что флаг '-' работает (он принуждает поля к левому выравниванию). В отличие от -print, опция -printf не добавляет новую строку в конец строки. Экранирования и директивы следующие:
\a Alarm bell (бип, звоночек). \b Backspace (очистка на один символ назад). \c Остановка печати из этого формата немедленно из сброс буфера вывода (flush). \f Form feed (перевод страницы). \n Newline (новая строка). \r Carriage return (возврат каретки). \t Horizontal tab (горизонтальная табуляция). \v Vertical tab (вертикальная табуляция). \0 ASCII NUL. \\ Литеральный backslash ('\'). \NNN Символ, у которого ASCII-код равен NNN (восьмеричное счисление).
Символ '\', за которым следует любой другой символ, рассматривается как обычный символ, поэтому они оба печатаются.
%% Литеральный знак процента. %a Время последнего доступа к файлу в формате, который возвращает ctime(3), функция языка C. %Ak Время последнего доступа к файлу в формате, указанном через k, который либо '@', либо директива функции strftime(3) языка C. Далее показан неполный список значений для k. Обратитесь к документации по strftime(3) для получения полного списка. Некоторые символы спецификатора преобразования могут быть недоступны на всех системах из-за различий реализации библиотечной функции strftime(3).
@ количество секунд от Jan. 1, 1970, 00:00 GMT, с дробной частью.
Поля времени:
H час (00..23). I час (01..12). k час ( 0..23). l час ( 1..12). M минута (00..59). p AM или PM локали. r время в 12-часовом формате (hh:mm:ss [AP]M). S секунда (00.00 .. 61.00). Здесь присутствует дробная часть. T время в 24-часовом формате (hh:mm:ss.xxxxxxxxxx). + Дата и время, разделенные '+', например '2004-04-28+22:22:05.0'. Это расширение GNU. Время дается в текущей зоне времени (не что может влиять переменная окружения TZ). Поле секунд включает дробную часть. X локальное представление времени (H:M:S). Поле секунд включает дробную часть. Z временная зона (т. е., EDT), или тут ничего, если нельзя определить зону времени.
Поля даты:
a локальная аббревиатура для дня недели (Sun..Sat). A локальное полное именование дня недели, переменной длины (Sunday..Saturday). b локальная аббревиатура месяца (Jan..Dec). B локальное полное имя месяца, переменной длины (January..December). c локальные дата и время (Sat Nov 04 12:02:33 EST 1989). Формат такой же, как для ctime(3), так что для сохранения совместимости с таким форматом отсутствует дробная часть поля секунд. d день месяца (01..31). D дата (mm/dd/yy). F дата (yyyy-mm-dd). h то же самое, что и b. j день года (001..366). m месяц (01..12). U номер недели года с воскресеньем как первым днем недели (00..53). w день недели (0..6). W номер недели года с понедельником как первым днем недели (00..53). x локальное представление даты (mm/dd/yy). y последние 2 цифры года (00..99). Y год (1970...).
%b Пространство диска, используемое для этого файла, в единицах блоков по 512 байт. Поскольку пространство на диске выделяется кратно размеру блока в зависимости от операционной системы, это обычно больше чем %s/512, но оно также может быть меньше, если файл является разреженным файлом (sparse file, см. [7]).
%Bk Время рождения файла, т. е. время его создания в формате, указанном k, что то же самое, что и для %A. Эта директива дает пустую строку, если нижележащая операционная система не поддерживает время рождения файла.
%c Время последнего изменения статуса файла в формате, возвращаемом C-функцией ctime(3).
%Ck Время последнего изменения статуса файла в формате, указанном k, что то же самое, что и для %A.
%d Глубина вложенности файла в дереве директории; 0 означает, что файл это стартовая точка.
%D Номер устройства, на котором находится файл (поле st_dev структуры stat), в десятичной форме.
%f Печатает базовое имя файла (basename); это имя файла, из пути до которого удалены начальные директории (оставлен только последний элемент). Для /, результат будет '/'. Для получения примера см. секцию "ПРИМЕРЫ".
%F Тип файловой системы включен; это значение используется для -fstype.
%g Имя группы файла, или числовой group ID, если у группы нет имени.
%G Числовой group ID файла.
%h Имя директории; начальные директории в имени файла (все, кроме базового имени, т. е. без последнего элемента пути). Если имя файла не содержит слешей (поскольку он находится в текущей директории), то спецификатор %h расширяется до '.'. Для файлов, которые сами являются директориями и содержат слеш (включают /), %h расширяется в пустую строку. Для получения примера см. секцию "ПРИМЕРЫ".
%H Стартовая точка, под которой был найден файл.
%i Номер inode файла (в десятичной форме).
%k Пространство на диске, используемое для этого файла в блоках по 1 KB. Поскольку пространство на диске выделяется кратно размеру блока в зависимости от операционной системы, это обычно больше чем %s/1024, но оно также может быть меньше, если файл является разреженным файлом (sparse file, см. [7]).
%l Объект символической ссылки (пустая строка, если файл не символическая ссылка).
%m Биты разрешения файла (в восьмеричном виде). Эта опция использует 'традиционные' номера, которые использует большинство реализаций Unix, однако если ваша определенная реализация использует необычное упорядочивание восьмеричных бит разрешений, то вы увидите разницу между реальным режимом файла и выводом %m. Скорее всего вы захотите, чтобы был начальный 0 на этом числе, и для этого вы должны использовать флаг # (как например '%#m').
%M Разрешения файла (в символической форме, как для ls). Эта директива поддерживается в findutils 4.2.5 и более поздней версии.
%n Количество жестких ссылок (hard links) для файла.
%p Имя файла.
%P Имя файла с именем стартовой точки, под которой он был найден удаленным.
%s Размер файла в байтах.
%S Разреженность файла [7]. Это вычисляется как (BLOCKSIZE*st_blocks / st_size). Точное значение, которое вы получите для обычного файла определенной длины, зависит от системы. Однако обычно разреженные файлы будут иметь значение меньше 1.0, и файлы, которые используют косвенные блоки (indirect blocks), могут иметь значение больше 1.0. Как правило, количество блоков, используемое файлом, зависит от файловой системы. Значение, используемое для BLOCKSIZE, зависит от системы, однако обычно оно равно 512 байтам. Если размер файла нулевой, то печатаемое значение неопределенное. На системах, в которых нет поддержки для st_blocks, разреженность файла подразумевается 1.0.
%t Время последней модификации файла в формате, возвращаемом C-функцией ctime(3).
%Tk Время последней модификации файла в формате, указанном через k, что то же самое, что и для %A.
%u Имя пользователя файла, или числовой user ID, если у пользователя нет имени.
%U Числовой user ID файла.
%y Тип файла (наподобие как в ls -l), U=неизвестный тип (что не должно случиться).
%Y Тип файла (наподобие %y), плюс далее идут символические ссылки: 'L'=loop, 'N'=nonexistent, '?' для любой другой ошибки, когда происходит определение типа цели символической ссылки.
%Z Контекст безопасности файла (только для SELinux).
%{ %[ %( Зарезервировано для будущего использования.
Символ '%', следующий за любым другим символом, отбрасывается, но другие символы печатаются (не следует на это полагаться, потому что могут появиться в будущем другие символы формата). '%' в конце аргумента формата приведет к неопределенному поведению, поскольку нет последующего символа. На некоторых локалях это может скрыть ваши дверные ключи (door keys), в то время как на других это может удалить последнюю страницу романа, который вы читаете.
Директивы %m и %d поддерживают флаги #, 0 и +, однако другие директивы их не поддерживают, даже если они печатают числа. Числовые директивы, которые не поддерживают эти флаги, включают G, U, b, D, k и n. Флаг формата '-' поддерживается и меняет выравнивание поля с правого выравнивания (которое действует по умолчанию) на левое выравнивание.
См. "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ" для информации о том, как обрабатываются необычные символы в именах файлов.
-prune
True; если файл это директория, то заход в неё не осуществляется. Если предоставлена опция -depth, то опция -prune не дает эффекта. Из-за того, что -delete подразумевает -depth, вы не можете с пользой использовать вместе -prune и -delete. Например, чтобы пропустить директорию src/emacs и все файлы и директории под ней, и напечатать имена других найденных файлов, сделайте что-то типа следующего:
find . -path ./src/emacs -prune -o -print
-quit
Немедленный выход (с нулевым значением возврата, если не было ошибок). Это отличается от -prune, потому что -prune только применяется к содержимому пропущенных (pruned) директорий, в то время как -quit просто немедленно останавливает find. Никакие дочерние процессы не оставляются. Любые командные строки, которые содержат -exec ... + или -execdir ... + запускаются перед выходом их программы. После выполнения -quit никакие другие файлы, указанные в командной строке, не обрабатываются. Например, 'find /tmp/foo /tmp/bar -print -quit' напечатает только '/tmp/foo'. Одно из общих использований -quit это остановка поиска по файловой системе, как только найдено то, что вы хотите. Например, если мы хотим найти только один файл, то мы можем сделать следующее:
find / -name needle -print -quit
[ОПЕРАТОРЫ]
Список операторов в порядке уменьшения их приоритета:
( expr )
Принудительно устанавливает приоритет. Поскольку скобки это специальный символ для шелла, то вам скорее всего понадобится применить для них кавычки. Многие примеры в этом руководстве используют для этой цели обратный слеш '\(...\)' вместо '(...)'.
! expr
True, если expr false. Этот символ также также будет нуждаться в защите от интерпретации шеллом.
-not expr
То же самое, что и ! expr, но это несовместимо с POSIX.
expr1 expr2
Два выражения в строке объединяются неявно через -a (операция И); expr2 не вычисляется, если expr1 false.
expr1 -a expr2
То же самое, что и expr1 expr2.
expr1 -and expr2
То же самое, что и expr1 expr2, но это несовместимо с POSIX.
expr1 -o expr2
ИЛИ; expr2 не вычисляется, если expr1 true.
expr1 -or expr2
То же самое, что и expr1 -o expr2, но это несовместимо с POSIX.
expr1 , expr2
Список; вычисляются оба выражения expr1 и expr2. Значение expr1 отбрасывается; значение списка это значение expr2. Разделитель запятая может быть полезна для поиска различных тиров вещей, однако проход по иерархии директории произойдет только 1 раз. Действие -fprintf может быть использовано для списка различных совпавших элементов в несколько различных выходных файлов.
Обратите внимание, что когда -a указано неявно (например 2 теста появились без явного оператора между ними) или явно, это имеет приоритет выше, чем -o. Это означает, что find . -name afile -o -name bfile -print никогда не напечатает afile.
[НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ]
Многин действия find приводят к печати данных, которые находятся под контролем других пользователей. Это включает имена файлов, размеры, времена модификации и так далее. Имена файлов составляют потенциальную проблему, поскольку они могут содержать любые символы, кроме '\0' и '/'. Необычные символы в именах файлов могут приводить к неожиданным и часто нежелательным вещам для вашего терминала (например, изменение настроек ваших функциональных клавиш на некоторых терминалах). Необычные символы обрабатываются по-разному в зависимости от различных действий, как описано ниже.
-print0, -fprint0
Всегда печатает точное имя файла, без изменений, даже если вывод идет на терминал.
-ls, -fls
Необычные символы всегда экранируются (escaped). Символы пробела, обратного слеша и двойной кавычки печатается с использованием экранирования в стиле языка C (C-style escape, например '\f', '\"'). Другие необычные символы печатаются с использованием восьмеричного экранирования (octal escape). Другие печатаемые символы (для -ls и -fls эти символы находятся в диапазоне восьмеричных значений между 041 и 0176) выводятся как есть.
-printf, -fprintf
Если вывод не происходит в терминал, то печать происходит как есть. Иначе результат зависит от того, какая директива используется. Директивы %D, %F, %g, %G, %H, %Y и %y раскрываются в значения, которые не находятся под управлением владельцев файлов, и таким образом печатаются как есть. Директивы %a, %b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u и %U имеют значения, которые находятся под управлением владельцев файлов, но некоторые из них не могут использоваться для отправки произвольных данных на терминал, и поэтому они печатаются как есть. Директивы %f, %h, %l, %p и %P обрамляются кавычками. Это обрамление выполняется таким же методом, как для GNU ls. Это не тот же самый механизм обрамления кавычками как тот, что используется для -ls и -fls. Если вы можете решить, какой формат использовать для вывода find, то обычно лучше использовать '\0' в качестве терминатора вместо использования для этого символа новой строки, поскольку имена файлов могут содержать символы пробела и новой строки. Установка переменной окружения LC_CTYPE используется для того, чтобы определить, какие символы нуждаются в обрамлении кавычками.
-print, -fprint
Закавычивание обрабатывается так же, как для -printf и -fprintf. Если вы используете find в скрипте или в ситуации, когда совпавшие файлы могут иметь произвольные имена, то вы должны рассмотреть использование -print0 вместо -print.
Действия -ok и -okdir печатают текущее имя файла как есть. Это может поменяться в будущем релизе.
[СООТВЕТСТВИЕ СТАНДАРТАМ]
Чтобы лучше всего обеспечивать совместимость со стандартом POSIX, вы должны установить переменную окружения POSIXLY_CORRECT. Следующие опции указаны в стандарте POSIX (IEEE Std 1003.1-2008, 2016 Edition):
-H Эта опция поддерживается.
-L Эта опция поддерживается.
-name Эта опция поддерживается, однако совместимость POSIX зависит от совместимости системной библиотечной функции fnmatch(3). В findutils-4.2.2 метасимволы шелла ('*', '?' or '[]' for example) соответствуют начальной '.', поскольку этого требует интерпретация IEEE PASC 126. Это поменялось в сравнении с предыдущими версиями findutils.
-type Поддерживается. POSIX указывает 'b', 'c', 'd', 'l', 'p', 'f' и 's'. GNU find также поддерживает 'D', представляющее Door (дверь), где операционная система это обеспечивает. Кроме того, GNU find позволяет указать несколько типов сразу в виде списка, где в качестве разделителя используется запятая.
-ok Поддерживается. Интерпретация ответа осуществляется в соответствии с шаблонами 'yes' и 'no', выбранными путем установки переменной окружения LC_MESSAGES. Когда установлена переменная окружения POSIXLY_CORRECT, её шаблоны берутся из определения системой положительного (yes) или отрицательного (no) ответа. См. документацию системы для nl_langinfo(3), в частности YESEXPR и NOEXPR. Когда переменная окружения POSIXLY_CORRECT не установлена, вместо этого шаблоны берутся из собственного каталога сообщений find.
-newer Поддерживается. Если указанный файл это символическая ссылка, то она всегда разыменовывается. Это поменялось из предыдущего поведения, которое использовалось для взятия соответствующего времени из символической ссылки; см. далее секцию "ИСТОРИЯ".
-perm Поддерживается. Если не установлена переменная окружения POSIXLY_CORRECT, то некоторые аргументы доступа mode (например +a+x), которые недопустимы в POSIX, поддерживаются для обеспечения обратной совместимости.
Прочие первичные опции
Поддерживаются все первичные опции -atime, -ctime, -depth, -exec, -group, -links, -mtime, -nogroup, -nouser, -ok, -path, -print, -prune, -size, -user и -xdev.
Стандарт POSIX определяет операторы скобок '(', ')', отрицания '!' и логического И/ИЛИ (AND/OR) -a и -o.
Все другие опции, предикаты, выражения и так далее являются расширениями за пределами стандарта POSIX. Однако многие из этих расширений не являются уникальными для GNU find.
Стандарт POSIX требует, чтобы find детектировала циклы (loops): должны определяться бесконечные циклы; т. е. имеется в виду вход в ранее посещенный каталог, который является предком последнего встреченного файла. Когда был определен бесконечный цикл, утилита find должна вывести диагностическое сообщение в поток стандартных ошибок и должна либо восстановить свою позицию в иерархии, или завершить работу.
GNU find удовлетворяет этим требованиям. Количество ссылок в директориях, которые содержат записи, являющимися жесткими ссылками на предка, часто будет ниже, чем они должны быть в противном случае. Это может означать, что иногда GNU find будет оптимизировать посещение подкаталога, который является на самом деле ссылкой на предка. Поскольку find фактически не выполняет вход в такой подкаталог, то разрешается избегать выдачи диагностического сообщения. Хотя такое поведение может быть несколько запутанным, маловероятно, что кто-либо действительно зависит от такого поведения. Если выключена leaf-оптимизация опцией -noleaf, то элемент директории всегда будет проверяться и будет выдано диагностическое сообщение там, где это уместно. Символические ссылки не могут использоваться для создания циклов файловой системы как таковых, но если используется опция -L или -follow, то будет выдано диагностическое сообщение, когда find столкнулась с циклом символических ссылок. Как и в случае с циклами, содержащими жесткие ссылки, leaf-оптимизация часто будет означать, что find знает, что ей не нужно вызывать stat() или chdir() на символической ссылке, поэтому такая диагностика часто не требуется.
Опция -d поддерживается для совместимости с различными системами BSD, однако вы должны вместо этого использовать POSIX-совместимую опцию -depth.
Переменная окружения POSIXLY_CORRECT не влияет на поведение тестов -regex или -iregex, потому что эти тесты не указаны в стандарте POSIX.
[ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ]
LANG
Предоставляет значение по умолчанию для переменных интернационализации, которые не установлены или null.
LC_ALL
Если установлена в непустое строковое значение, то переназначает значения всех других интернационализационных переменных.
LC_COLLATE
Стандарт POSIX устанавливает, что эта переменная влияет на сопоставление с шаблоном, используемое для опции -name. GNU find использует библиотечную функцию fnmatch(3), и поэтому поддержка LC_COLLATE зависит от библиотеки системы. Эта переменная также влияет на интерпретацию ответа на -ok; в то время как переменная LC_MESSAGES выбирает фактический шаблон, используемый для интерпретации ответа на -ok, интерпретации любых выражений скобок в шаблоне будет зависеть от LC_COLLATE.
LC_CTYPE
Эта переменная влияет на обработку классов символов, используемых в регулярных выражениях, и также с тестом -name, если библиотечная функция fnmatch(3) системы это поддерживает. Эта переменная также влияет на интерпретацию любых классов символов в регулярных выражениях, используемых для интерпретации ответа на промт, выданный действием -ok. Переменная окружения LC_CTYPE также будет влиять на то, какие символы считаются непечатаемыми, когда печатаются имена файлов; см. секцию "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ".
LC_MESSAGES
Определяет локаль, используемую для интернационализированных сообщений. Если установлена переменная окружения POSIXLY_CORRECT, то это также определяет интерпретацию ответа на промт, выданный действием -ok.
NLSPATH
Определяет местоположение каталогов сообщений интернационализации.
PATH
Влияет на директории, по которым find ищет исполняемые файлы при использовании -exec, -execdir, -ok и -okdir.
POSIXLY_CORRECT
Определяет размер блока, используемый -ls and -fls. Если установлена POSIXLY_CORRECT, блоки представляют единицы по 512 байт. Иначе блоки это единицы по 1024 байт.
Установка этой переменной также выключит предупреждающие сообщения (т. е. подразумевается -nowarn) по умолчанию, потому что POSIX требует, чтобы все сообщения, кроме вывода для -ok, печатаемые на stderr, были диагностическими, и должны иметь ненулевой статус выхода.
Когда POSIXLY_CORRECT не установлена, -perm +zzz обрабатывается просто наподобие -perm /zzz, если +zzz недопустимый символический режим доступа (mode). Когда POSIXLY_CORRECT установлена, такие конструкции обрабатываются как ошибка.
Когда POSIXLY_CORRECT установлена, ответ на промт действия -ok интерпретируется в соответствии с каталогом сообщений системы, а не в соответствии с собственными трансляциями find.
TZ
Влияет на временную зону (time zone), используемую для некоторых директив, связанных с форматом времени -printf и -fprintf.
[ПРИМЕРЫ]
Простой подход 'find|xargs'
• Найдет файлы с именем core в директории /tmp или под ней, и удалит их.
$ find /tmp -name core -type f -print | xargs /bin/rm -f
Обратите внимание, что это не будет работать корректно, если имена файлов содержат символы новых строк, одиночные или двойные кавычки или пробелы.
Более безопасный подход 'find -print0 | xargs -0'
• Найдет файлы с именем core в директории /tmp или под ней, и удалит их, обрабатывая имена файлов таким образом, чтобы корректно обрабатывались имена файлов или каталогов, содержащие одинарные или двойные кавычки, пробелы или символы новой строки.
$ find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Тест -name вставлен перед тестом -type, чтобы избежать вызова stat(2) на каждом файле.
Обратите внимание, что все еще существует рейсинг между временем, когда find осуществляет проход печати иерархии совпавших имен файлов, и времени, когда процесс, запускаемый xargs, работает с этим файлом.
Обработка произвольных стартовых точек
• Учитывая, что другая программа proggy делает предварительную фильтрацию и создает большой список файлов с NUL-разделителем, произойдет обработка этого списка как стартовых точек, и find найдет в них обычные пустые файлы:
$ proggy | find -files0-from - -maxdepth 0 -type f -empty
Использование '-files0-from -' означает чтение имен стартовых точек из стандартного ввода, т. е. из канала (|, pipe); и -maxdepth 0 гарантирует, что проверяются только эти элементы, без захода в подкаталоги (когда в стартовых точках есть подкаталоги).
Выполнение команды для каждого файла
• Запуск file на каждом файле, который находится в текущей директории или под ней.
$ find . -type f -exec file '{}' \;
Обратите внимание, что фигурные скобки заключены в одинарные кавычки для защиты их от интерпретации как пунктуации скрипта шелла. Точка с запятой в конце подобным образом защищена обратным слешем, хотя для той же цели можно было использовать те же одинарные кавычки.
Во многих случаях может быть предпочтительнее использовать синтаксис '-exec ... +' или лучше '-execdir ... +' по соображениям производительности и безопасности.
Проход по файловой системе только один раз - для 2 различных действий
• Проход по файловой системе только раз, генерация листинга файлов и директорий set-user-ID в /root/suid.txt, и больших файлов в /root/big.txt.
$ find / \
\( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
\( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
Этот пример использует символ продолжения командной строки '\' на первых двух строках, что инструктирует шелл продолжать чтение команды на двух следующих строках.
Поиск файлов по возрасту
• Поиск файлов в вашей домашней директории, которые были изменены за последние 24 часа.
$ find $HOME -mtime 0
Эта команда сработает, потому что время, прошедшее с момента изменения каждого файла, делится на 24 часа, и любой остаток отбрасывается. Это означает, что для совпадения с -mtime 0 у файла будет время модификации в прошлом менее 24 часа назад.
Поиск файлов по правам доступа
• Поиск файлов, которые исполняемые, но не читаемые.
$ find /sbin /usr/sbin -executable \! -readable -print
• Поиск файлов, у которых есть разрешение на чтение и запись для их владельца, но которые другие пользователи могут только читать, но не записывать.
$ find . -perm 664
Не будут найдены файлы, которые удовлетворяют этим критериям, но имеют другие установленные биты разрешений (например если кто-то может выполнить файл).
• Поиск файлов, у которых есть разрешение на чтение и запись для их владельца и группы, и которые другие пользователи могут читать, не обращая внимания на присутствие других дополнительных бит разрешений (например бит исполнения).
$ find . -perm -664
Например, это будет соответствовать файлу, у которого mode 0777.
• Поиск файлов, доступных для записи кем-либо (их владельцем, или их группе, или кому-либо еще).
$ find . -perm /222
• Поиск файлов, которые могут записывать их владелец или их группа.
$ find . -perm /220
$ find . -perm /u+w,g+w
$ find . -perm /u=w,g=w
Все эти три команды делают то же самое, однако первая использует восьмеричное представление режима доступа к файлу (file mode), а две другие используют символическую форму. Для сопоставления файлы не должны быть доступны для записи как владельцем, так и группой; либо сопоставление подойдет.
• Поиск файлов, которые могут записываться как их владельцем, так и их группой.
$ find . -perm -220
$ find . -perm -g+w,u+w
Обе эти команды делают одно и то же.
• Более продвинутый поиск на основе разрешений.
$ find . -perm -444 -perm /222 \! -perm /111
$ find . -perm -a+r -perm /a+w \! -perm /a+x
Обе эти команды ищут файлы, которые могут быть прочитаны всеми (-perm -444 или -perm -a+r), имеют как минимум один установленный бит записи (-perm /222 или -perm /a+w), но не могут выполняться всеми (! -perm /111 или ! -perm /a+x соответственно).
Pruning - пропуск файлов и подкаталогов
• Копирование содержимого /source-dir в /dest-dir, но пропуская файлы и директории с именем .snapshot (и что-нибудь в них). Это также пропустит файлы или директории, у которых имя заканчивается на '~', но не их содержимое.
$ cd /source-dir
$ find . -name .snapshot -prune -o \( \! -name '*~' -print0 \) \
| cpio -pmd0 /dest-dir
Конструкция -prune -o \( ... -print0 \) встречается довольно часто. Идея здесь заключается в том, что выражение перед -prune соответствует тому, что должно быть обрезано (pruned). Однако само действие -prune вернет true, так что последующее -o гарантирует, что правая часть оценивается только для тех каталогов, которые не были обрезаны (содержимое обрезанных директорий не просматривается, так что их содержимое просто пропускается и не имеет значения). Выражение с правой стороны -o составлено в скобках только для ясности. Это подчеркивает, что действие -print0 имеет место только для тех вещей, к которым не применено -prune. Поскольку по умолчанию условие 'and' между тестами связывается более тесно, чем -o, это в любом случае сработает, но скобки помогают более ясно показать, что происходит.
• По следующей директории проектов и связанных с ними административных директорий SCM, выполнить эффективный поиск корней проектов:
$ find repo/ \
\( -exec test -d '{}/.svn' \; \
-or -exec test -d '{}/.git' \; \
-or -exec test -d '{}/CVS' \; \
\) -print -prune
Пример вывода:
repo/project1/CVS
repo/gnu/project2/.svn
repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
В этом примере -prune предотвращает нежелательный спуск в подкаталоги, которые уже были обнаружены (например, мы не будем делать поиск по project3/src, потому что уже была найдена папка project3/.svn), однако обеспечивается нахождение соседних директорий (project2 и project3).
Другие полезные примеры
• Поиск некоторых типов файлов.
$ find /tmp -type f,d,l
Делает поиск файлов, директорий и символических ссылок в директории /tmp с передачей этих типов в виде списка с разделителем запятой (расширение GNU), который иначе эквивалентен более длинному, но более портируемому:
$ find /tmp \( -type f -o -type d -o -type l \)
• Поиск фалов с определенным именем needle, с немедленной остановкой при первом же найденном.
$ find / -name needle -print -quit
• Демонстрация интерпретации директив формата %f и %h действия -printf для некоторых случаев. В этом примере показан некоторый вывод.
$ find . .. / /tmp /tmp/TRACE compile compile/64/tests/find -maxdepth 0 -printf '[%h][%f]\n'
[.][.]
[.][..]
[][/]
[][tmp]
[/tmp][TRACE]
[.][compile]
[compile/64/tests][find]
[EXIT STATUS (статус выхода)]
Утилита find завершит работу (exit) со статусом 0, если все файлы успешно обработаны, и со статусом больше 0, если произошли ошибки. Это умышленно очень широкое описание, но если возвращаемое значение ненулевое, то не стоит полагаться на результаты поиска.
При некоторых ошибках find может немедленно остановить работу, без завершения всех указанных действий. Например, некоторые стартовые точки могут быть не проверены, или ожидающие запуска программы для -exec ... {} + или -execdir ... {} + may могут не быть выполнены.
[ИСТОРИЯ]
Программа find появилась в Version 5 Unix как часть проекта Programmer's Workbench, и она была написана Dick Haight. Doug McIlroy's A Research UNIX Reader: Annotated Excerpts from the Programmer’s Manual, 1971-1986 предоставляет некоторые дополнительные детали; это можно прочитать онлайн по ссылке [6].
GNU find изначально была написана Eric Decker, с улучшениями David MacKenzie, Jay Plett и Tim Wood. Идея для find -print0 и xargs -0 поступила от Dan Bernstein.
[СОВМЕСТИМОСТЬ]
В findutils-4.2.2 метасимволы оболочки (shell metacharacters, например '*', '?' или '[]'), используемые в шаблонах имен, соответствуют начальной '.', потому что этого требует интерпретация IEEE POSIX 126.
В findutils-4.3.3 опция -perm /000 теперь соответствует всем файлам вместо одного.
Метки времени с наносекундной разрешающей способностью были реализованы в findutils-4.3.3.
В findutils-4.3.11 действие -delete установит статус выхода find в ненулевое значение, если действие было неудачным. Однако find при этом не выполнит немедленный выход. Ранее на статус выхода find не влиял отказ действия -delete.
Функция |
Добавлена в |
Также имеется в |
-files0-from |
4.9.0 |
|
-newerXY |
4.3.3 |
BSD |
-D |
4.3.1 |
|
-O |
4.3.1 |
|
-readable |
4.3.0 |
|
-writable |
4.3.0 |
|
-executable |
4.3.0 |
|
-regextype |
4.2.24 |
|
-exec ... + |
4.2.12 |
POSIX |
-execdir |
4.2.12 |
BSD |
-okdir |
4.2.12 |
|
-samefile |
4.2.11 |
|
-H |
4.2.5 |
POSIX |
-L |
4.2.5 |
POSIX |
-P |
4.2.5 |
BSD |
-delete |
4.2.3 |
|
-quit |
4.2.3 |
|
-d |
4.2.3 |
BSD |
-wholename |
4.2.0 |
|
-iwholename |
4.2.0 |
|
-ignore_readdir_race |
4.2.0 |
|
-fls |
4.0 |
|
-ilname |
3.8 |
|
-iname |
3.8 |
|
-ipath |
3.8 |
|
-iregex |
3.8 |
|
Синтаксис -perm +MODE был удален в findutils-4.5.12, потому что появилось -perm /MODE. Синтаксис +MODE устарел с момента релиза findutils-4.2.21 в 2005 году.
[NON-BUGS]
Сюрпризы приоритета оператора
Команда find . -name afile -o -name bfile -print никогда не напечатает afile, потому что это эквивалентно find . -name afile -o \( -name bfile -a -print \). Помните, что у оператора -a приоритет выше, чем у оператора -o, и что когда между тестами не указан оператор, то подразумевается -a.
Сообщение об ошибке "paths must precede expression"
$ find . -name *.c -print
find: paths must precede expression
find: possible unquoted pattern after predicate '-name'?
Это происходит, когда шелл может расширить шаблон до более чем одного имени файла, существующего в текущей директории, и передать результирующие имена файлов в командной строке, чтобы найти что-нибудь наподобие:
find . -name frcode.c locate.c word_io.c -print
Конечно, такая команда не сработает, потому что предикат -name позволяет в качестве аргумента применить только один шаблон. Вместо этого вам следует заключить шаблон в кавычки, или экранировать wildcard, это позволит find использовать шаблон с wildcard во время поиска файла, вместо нескольких имен, которые расширит родительский шелл:
$ find . -name '*.c' -print
$ find . -name \*.c -print
[BUGS]
Существуют проблемы безопасности, присущие поведению, которое стандарт POSIX определяет для find, так что это нельзя исправить. Например, действие -exec по своей сути не безопасно, и вместо него следует использовать -execdir.
Переменная окружения LC_COLLATE не дает эффекта на действии -ok.
[СМ. ТАКЖЕ]
chmod(1), locate(1), ls(1), updatedb(1), xargs(1), lstat(2), stat(2), ctime(3) fnmatch(3), printf(3), strftime(3), locatedb(5), regex(7)
Полная документация < https://www.gnu.org/software/findutils/find>, или доступная локально через команду: info find.
[Ссылки]
1. find(1) Linux manual page site:man7.org. 2. find: как исключить директорию из поиска? 3. Странное поведение команды find. 4. Мини-справочник по командам UNIX. 5. grep: примеры использования. 6. A Research UNIX Reader: Annotated Excerpts from the Programmer’s Manual, 1971-1986 M. Douglas McIlroy site:dartmouth.edu. 7. Что такое разреженный файл (sparse file)? |