Scroll to navigation

FIND(1) General Commands Manual FIND(1)

НАИМЕНОВАНИЕ

find - поиск файлов в иерархии каталогов

ОБЗОР

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

ОПИСАНИЕ

На этой странице руководства документирована версия find GNU для. GNU find выполняет поиск в дереве каталогов с корнем в каждой заданной начальной точке (starting-point), вычисляя данное выражение слева направо в соответствии с правилами приоритета (см. раздел "ОПЕРАТОРЫ"), пока не будет известен результат (левая часть равна ложно (false) для логических операций И или истинно (true) для логических операций ИЛИ); после этого find переходит к следующему имени файла. Если начальная точка не указана, то предполагается ".".

Если вы используете find в среде, где важна безопасность (например, если вы используете её для поиска в каталогах, доступных для записи другими пользователями), вам следует прочитать главу "Соображения безопасности" документации утилиты find, которая вызывается Finding Files и поставляется с утилитой find. Данный документ также содержит гораздо больше подробностей и обсуждений, чем эта страница руководства, так что вы можете счесть его более полезным источником информации.

ОПЦИИ

Параметры -H, -L и -P управляют обработкой символических ссылок. Следующие за ними аргументы командной строки принимаются за имена проверяемых файлов или каталогов, вплоть до первого аргумента, начинающегося с "-", или аргумента "(" или "!". Этот аргумент и все последующие аргументы принимаются за выражение (expression), описывающее то, что требуется найти. Если пути не указаны, используется текущий каталог. Если выражение не задано, используется выражение -print (но в любом случае вам, вероятно, следует рассмотреть возможность использования -print 0 вместо этого).

На этой странице руководства рассказывается о "параметрах" в списке выражений. Эти параметры управляют поведением find, но указываются сразу после последнего имени пути. Пять "реальных" параметров -H, -L, -P, -D и -O должны быть определены перед первым именем пути, если они вообще определены. Двойное тире -- теоретически может использоваться для обозначения того, что все оставшиеся аргументы не являются параметрами, но на самом деле это не работает из-за того, как find определяет конец следующих аргументов пути: она делает это с помощью чтения до тех пор, пока не появится аргумент выражения (который также начинается с `-"). Теперь, если аргумент path будет начинаться с `-', то вместо этого find будет рассматривать его как аргумент выражения. Таким образом, чтобы гарантировать, что все начальные точки приняты как таковые, и особенно для предотвращения того, чтобы шаблоны подстановочных знаков, расширяемые вызывающей оболочкой, не были ошибочно приняты за аргументы выражения, обычно безопаснее добавлять к подстановочным знакам или сомнительным именам путей префикс "./" или использовать абсолютные имена путей, начинающиеся с "/". В качестве альтернативы, как правило, безопасно, хотя и непереносимо, использовать параметр GNU -files0-from для передачи произвольных начальных точек в find.

Никогда не переходить по символическим ссылкам. Это поведение по умолчанию. Когда find проверяет или выводит информацию о файлах, а файл является символической ссылкой, используемая информация должна быть взята из свойств самой символической ссылки.

Переходить по символическим ссылкам. Когда find проверяет или выводит информацию о файлах, используемая информация должна быть взята из свойств файла, на который указывает ссылка, а не из самой ссылки (если только это не поврежденная символическая ссылка или если find не может проверить файл, на который указывает ссылка). Использование этого параметра подразумевает параметр -noleaf. Если вы позже воспользуетесь параметром -P, то параметр -noleaf по-прежнему будет действовать. Если -L действует и find обнаруживает символическую ссылку на подкаталог во время поиска, будет выполнен поиск в подкаталоге, на который указывает символическая ссылка.
Когда действует параметр -L, предикат -type всегда будет соответствовать типу файла, на который указывает символическая ссылка, а не самой ссылке (если только символическая ссылка не повреждена). Действия, которые могут привести к разрыву символических ссылок во время выполнения find (например, -delete), могут привести к сбивающему с толку поведению. Использование -L приводит к тому, что предикаты -lname и -il name всегда возвращают значение false.

Не переходить по символическими ссылкам, за исключением случаев обработки аргументов командной строки. Когда find проверяет или выводит информацию о файлах, используемая информация должна быть взята из свойств самой символический ссылке. Единственным исключением из этого правила является случай, когда файл, указанный в командной строке, является символической ссылкой и эта ссылка может быть разрешена. В этом случае используемая информация берется из того, на что указывает ссылка (то есть, если перейти по ссылке). Информация о самой ссылке используется в качестве запасного варианта, если файл, на который указывает символическая ссылка, не может быть проверен. Если -H действует и один из путей, указанных в командной строке, является символической ссылкой на каталог, содержимое этого каталога будет проверено (хотя, конечно, параметр -maxdepth 0 предотвратил бы это).

Если указано более одного из параметров -H, -L и -P, то каждый из них переопределяет остальные; вступает в силу параметр, который указан последним в командной строке. Поскольку это значение используется по умолчанию, то параметр -P следует считать действующим, если только не указаны параметры -H или -L.

GNU find часто проверяет файлы во время обработки в самой командной строке, перед началом любого поиска. Эти параметры также влияют на обработку этих аргументов. В частности, существует ряд тестов, которые сравнивают файлы, указанные в командной строке, с файлом, который мы рассматриваем в данный момент. В каждом случае файл, указанный в командной строке, будет проверен и некоторые его свойства будут сохранены. Если именованный файл на самом деле является символической ссылкой и используется параметр -P (или если не были указаны ни -H, ни -L), то информация, используемая для сравнения, будет взята из свойств символической ссылки. В противном случае она будет взята из свойств файла, на который указывает ссылка. Если пользователь find не может перейти по ссылке (например, из-за недостаточных прав доступа или из-за того, что ссылка указывает на несуществующий файл), то будут использованы свойства самой ссылки.

Когда определены параметры -H или -L, все символические ссылки, указанные в качестве аргумента параметра -newer, будут разыменованы, а временная метка будет взята из файла, на который указывает символическая ссылка. То же самое относится и к параметрам -newerXY, -a newer и -c newer.

Параметр -follow имеет тот же эффект, что и параметр -L, хотя он вступает в силу в том месте, где он появляется (то есть, если параметр -L не используется, а используется параметр -follow, то любая символическая ссылка, появляющаяся после параметра -follow в командной строке, будет разыменована, а те, что были до него, - нет).

-D debugopts
Вывести диагностическую информацию; это может быть полезно для диагностики проблем, связанных с тем, почему find не выполняет то, что вы хотите. Список параметров отладки должен быть разделен запятыми. Совместимость параметров отладки между версиями утилиты find не гарантируется. Полный список допустимых параметров отладки приведен в выходных данных find -D help. Поддерживаются нижеследующие параметры отладки.
Отображать диагностическую информацию, относящуюся к -exec, -exec dir, -ok и -okdir.
Выводить диагностическую информацию, относящуюся к оптимизации дерева выражений; смотрите параметр -O.
Выводить сводную информацию, указывающую, как часто каждый предикат выполнялся успешно или с ошибкой.
Подробная навигация по дереву каталогов.
Выводить сообщения по мере проверки файлов с помощью системных вызовов stat и lstat. Программа find старается свести к минимуму количество таких вызовов.
Показывает дерево выражений в его первоначальном и оптимизированном виде.
Включить все остальные параметры отладки (кроме help).
Вывести сведения о параметрах отладки.
Включить оптимизацию запросов. Утилита find переупорядочивает тесты, чтобы ускорить выполнение (при сохранении общего эффекта); то есть предикаты с побочными эффектами не переупорядочиваются относительно друг друга. На каждом уровне оптимизации выполняется следующая оптимизация.
0
Эквивалентно уровню оптимизации 1.
1
Это уровень оптимизации по умолчанию, который соответствует традиционному поведению. Выражения переупорядочены таким образом, чтобы сначала выполнить тесты, основанные только на именах файлов (например, -name и -regex).
2
Любые тесты -type или -xtype выполняются после любых тестов, основанных только на именах файлов, но перед любыми тестами, требующими получения информации из индексного дескриптора. Во многих современных версиях Unix типы файлов возвращаются с помощью функции readdir() и поэтому эти предикаты вычисляются быстрее, чем предикаты, которые сначала должны определить файл. Если вы используете предикат -fstype FOO и указываете тип файловой системы FOO, который неизвестен (то есть присутствует в `/etc/mtab') на момент запуска find, то этот предикат эквивалентен -false.
3
На этом уровне оптимизации включен полный оптимизатор запросов, основанный на затратах. Порядок выполнения тестов изменен таким образом, что сначала выполняются "дешевые" (т.е. быстрые) тесты, а более "дорогие", при необходимости, выполняются позже. В пределах каждой группы затрат предикаты оцениваются раньше или позже в зависимости от того, будут ли они успешными или нет. Для -o предикаты, которые, вероятно, будут выполнены успешно, вычисляются раньше, а для -a предикаты, которые, вероятно, завершатся неудачей, вычисляются раньше.
Оптимизатор, ориентированный на затраты, имеет четкое представление о том, насколько вероятно успешное проведение того или иного теста. В некоторых случаях вероятность учитывает специфику теста (например, предполагается, что -type f имеет больше шансов на успех, чем -type). В настоящее время проводится оценка оптимизатора, основанного на затратах. Если это на самом деле не улучшит производительность find, то эта оптимизация будет снова удалена. И наоборот, оптимизации, которые оказались надежными и действенными, со временем могут быть включены на более низких уровнях оптимизации. Однако поведение по умолчанию (т.е. уровень оптимизации 1) не будет изменено в серии выпусков 4.3.x. Набор тестов утилиты find запускает все тесты find на каждом уровне оптимизации и гарантирует, что результат будет одинаковым.

ВЫРАЖЕНИЕ

Выражением (expression) называется часть командной строки, следующая за списком начальных точек. Это своего рода спецификация запроса, описывающая, как мы сопоставляем файлы и что мы делаем с файлами, которые были сопоставлены. Выражение состоит из последовательности следующих элементов:

Тесты (Tests)
Тесты возвращают значение "истинно" ( true ) или "ложно" (false), обычно на основе какого-либо свойства рассматриваемого файла. Тест -empty, например, выполняется только в том случае, если текущий файл пуст.

Действия (Actions)
Действия всегда приводят к результатам (например, выводят что-либо на стандартный вывод) и возвращают значение true или false, обычно в зависимости от того, завершились действия успешно или нет. Например, действие -print выводит имя текущего файла на стандартный вывод.

Глобальные опции
Основные параметры влияют на выполнение тестов и действий, указанных в любой части командной строки. Основные параметры всегда возвращают значение "истинно" (true). Например, параметр -depth позволяет find просматривать файловую систему в порядке увеличения глубины (каталог, подкаталог и т. д.).

Позиционные параметры
Позиционные параметры влияют только на тесты или действия, которые следуют за ними. Позиционные параметры всегда возвращают значение "истинно" (true). Например, параметр -regextype является позиционным и определяет особенности регулярных выражений для регулярных выражений, появляющихся далее в командной строке.

Операторы
Операторы объединяют другие элементы в выражении. К ним относятся, например, оператор -o (означает логическое ИЛИ) и оператор -a (означает логическое И). Если оператор явно отсутствует, то предполагается, что это оператор -a.

Действие -print выполняется для всех файлов, для которых все выражение истинно (true), если только оно не содержит действия, отличного от -prune или -quit. Действия, которые блокируют выполнение -print по умолчанию, это -delete, -exec, -exec dir, -ok, -ok dir, -files, -print, -fprintf, -ls, -print и -printf.

Действие -delete также выполняет роль параметра (поскольку оно подразумевает -depth).

ПОЗИЦИОННЫЕ ПАРАМЕТРЫ

Позиционные параметры всегда возвращают значение истинно (true). Они влияют только на тесты, выполняемые далее в командной строке.

Измерять время (для значений -amin, -atime, -cmin, -time, -mmin и -mtime) с начала сегодняшних суток, а не с 24 часов назад. Этот параметр влияет только на тесты, которые появляются позже в командной строке.

Не рекомендуется (вместо этого используйте параметр -L). Разыменовывать символические ссылки. Подразумевает параметр -noleaf. Параметр -follow влияет только на те тесты, которые следуют после него в командной строке. Если не указан параметр -H или -L, расположение параметра -follow изменяет поведение предиката (в смысле математической логики) -newer; любые файлы, указанные в качестве аргумента параметра -newer, будут разыменованы, если они являются символическими ссылками. То же самое относится и к -newerXY, -anewer и -cnewer. Аналогично, предикат -type всегда будет соответствовать типу файла, на который указывает символическая ссылка, а не самой ссылке. Использование -follow приводит к тому, что предикаты -lname и -ilname всегда возвращают значение "ложно" (false).

Изменяет синтаксис регулярных выражений, понятный с помощью тестов -regex и -iregex, которые выполняются позже в командной строке. Чтобы узнать, какие типы регулярных выражений известны, используйте -regextype help. Документация Texinfo (обратитесь к СМОТРИТЕ ТАКЖЕ) объясняет значение и отличия между различными типами регулярных выражений.

Включить (-warn)или отключить (-nowarn ) сообщения. Эти предупреждения относятся только к использованию командной строки, а не к каким-либо условиям, с которыми может столкнуться find при поиске в каталогах. Поведение по умолчанию соответствует -warn, если стандартным вводом является tty и -nowarn в противном случае. Если выдается предупреждающее сообщение, относящееся к использованию командной строки, это не влияет на статус выхода find. Если задана переменная окружения POSIXLY_CORRECT и также используется -warn, то не определено, какие предупреждения будут активны, если таковые имеются.

ГЛОБАЛЬНЫЕ ОПЦИИ

Основные параметры всегда возвращают значение истинно (true). Основные параметры вступают в силу даже для тестов, которые выполняются ранее в командной строке. Чтобы избежать путаницы, основные параметры следует указывать в командной строке после списка начальных точек, непосредственно перед первым тестом, позиционным параметром или действием. Если вы укажете основной параметр в каком-либо другом месте, то find выдаст предупреждающее сообщение, объясняющее, что это может привести к путанице.

Общие параметры располагаются после списка начальных точек и поэтому не являются такими же параметрами, как, например, -L.

Синоним -depth, для обеспечения совместимости с FreeBSD, NetBSD, macOS X и OpenBSD.

Обрабатывать содержимое каждой директории перед самой директорией. Действие -delete также подразумевает -depth.

Прочитать начальные точки из file вместо того, чтобы получать их из командной строки. В отличие от известных ограничений передачи начальных точек с помощью аргументов в командной строке, а именно ограничений по количеству имен файлов и присущей им неоднозначности, когда имена файлов сталкиваются с именами параметров, использование этого параметра позволяет безопасно передавать произвольное количество начальных точек в find.

Использование этого параметра и передача начальных точек в командной строке являются взаимоисключающими и поэтому недопустимо использовать их одновременно.

Аргумент file является обязательным. Можно использовать -files0-from - для чтения списка начальных точек из standard input (стандартного ввода) и, например, из канала. В этом случае действия -ok и -okdir недопустимы, поскольку они, очевидно, помешали бы чтению из standard input для получения подтверждения пользователя.

Начальные точки в file должны быть разделены символами нуль-терминированной строки - ASCII NUL (0x00). Два последовательных символа NUL, т.е. начальная точка с именем файла нулевой длины, недопустимы и приведут к диагностике ошибки, за которой затем последует ненулевой код завершения.

В случае, если заданный file пуст, find не обрабатывает никакой начальной точки и, следовательно, завершит работу сразу после анализа аргументов программы. Это отличается от стандартного вызова, где find принимает текущий каталог в качестве начальной точки, если аргумент "path" не определён.

В остальном обработка начальных точек выполняется как обычно, например, find будет рекурсивно перемещаться по подкаталогам, если не запрещено иное. Для обработки только начальных точек можно дополнительно передать -maxdepth 0.

Дополнительные примечания: Если файл указан во входном файле более одного раза, то не определено, посещался ли он более одного раза. Если параметр file изменяется во время операции find, то результат также является неопределенным. Наконец, позиция поиска в именованном file в момент выхода find, будь то с помощью -quit или любым другим способом, также является неопределенной. Под "неопределенным" здесь подразумевается, что утилита find может работать, а может и не работать или выполнять какие-либо конкретные действия и что её поведение может меняться от платформы к платформе или от выпуска к выпуску утилиты find.

Вывести краткое описание по использованию find в командной строке и завершить работу.

Обычно find выдает сообщение об ошибке, когда ей не удается найти файл. Если вы зададите этот параметр и файл будет удален в промежутке между моментом, когда find считывает имя файла из каталога и моментом, когда она пытается сохранить файл, то сообщение об ошибке выдано не будет. Это также относится к файлам или каталогам, имена которых указаны в командной строке. Этот параметр вступает в силу во время чтения командной строки: это означает, что вы не можете выполнять поиск в одной части файловой системы с включенным этим параметром, а в другой - с выключенным параметром (если вам нужно это сделать, то вам следует выполнить вместо этого две команды find: одну с этим параметром, а другую без него).

Кроме того, find с параметром -ignore_readdir_race проигнорирует ошибки действия -delete в случае, если файл исчез с момента чтения родительского каталога: она не выдаст диагностику ошибки, а код возвращения действия -delete будет "истинно" (true).

Спуститься не более чем на levels уровней каталогов ниже начальных точек (это должно быть неотрицательное целое число). Использование -maxdepth 0 означает применение тестов и действий только к самим начальным точкам.

Не выполнять никаких тестов или действий на уровнях ниже levels (неотрицательное целое число). Использование -mindepth 1 означает обработку всех файлов, кроме начальных точек.

Не просматривать каталоги в других файловых системах. Альтернативное наименование для -x dev, для совместимости с некоторыми другими версиями find.

Отключить параметр -ignore_readdir_race.

Не проводить оптимизацию, предполагая, что в каталогах содержится на 2 подкаталога меньше, чем количество жестких ссылок на них. Этот параметр необходим при поиске в файловых системах, которые не соответствуют соглашению о ссылках в каталогах Unix, например, в файловых системах CD-ROM или MS-DOS, или в точках монтирования томов AFS. Каждый каталог в обычной файловой системе Unix имеет как минимум 2 жесткие ссылки: на его имя и на запись ".". Кроме того, каждый из его подкаталогов (если таковой имеется) имеет запись "..", связанную с этим каталогом. Когда find проверяет каталог, после того, как она обнаружила на 2 подкаталога меньше, чем количество ссылок в каталоге, она знает, что остальные записи в каталоге не являются каталогами (это -"конечные" файлы в дереве каталогов). Если нужно проверить только имена файлов, то нет необходимости их статистизировать, а это значительно увеличивает скорость поиска.

Вывести номер версии find и завершить работу.

Не удалять каталоги из других файловых систем.

ТЕСТЫ

Некоторые тесты, например -newerXY и -same file, позволяют сравнивать проверяемый в данный момент файл с некоторым эталонным файлом, указанным в командной строке. При использовании этих тестов интерпретация файла ссылок определяется параметрами -H, -L и -P, а также любыми предыдущими параметрами -follow, но файл ссылок проверяется только один раз, во время анализа командной строки. Если файл ссылки не может быть проверен (например, системный вызов stat(2) завершается ошибкой), выдается сообщение об ошибке и find завершает работу с ненулевым статусом.

В тестах (например, -amin, -mtime, -gid, -inum, -links, -size, -uid и -used) может быть определен числовой аргумент n в нижеследующих вариантах:

+n
более, чем n;
-n
менее чем n;
n
равно n.

Поддерживаются следующие тесты:

Последний раз к файлу обращались менее, более или ровно n минут назад.

Время последнего обращения к текущему файлу является более поздним, чем время последнего изменения данных в файле reference. Если reference является символической ссылкой и используется параметр -H или параметр -L, то всегда используется время последнего изменения данных файла, на который указывает эта ссылка.

Последний раз к файлу обращались менее, более или ровно n*24 часа назад. Когда find вычисляет, сколько 24-часовых периодов назад к файлу был осуществлен последний доступ, любая дробная часть игнорируется, поэтому для соответствия -atime +1 к файлу должен был быть осуществлен доступ по крайней мере two (двое) суток назад.

Статус файла в последний раз менялся менее, более или ровно n минут назад.

Время последнего изменения статуса текущего файла является более поздним, чем время последнего изменения данных в файле reference. Если reference является символической ссылкой и используется параметр -H или параметр -L, то всегда используется время последнего изменения данных в файле, на который указывает ссылка.

Статус файла в последний раз менялся менее, более или ровно 24 часа назад. Смотрите комментарии к -atime, чтобы понять, как округление влияет на интерпретацию времени изменения статуса файла.

Файл пуст и представляет собой либо обычный файл, либо каталог.

Сопоставлять, доступные для поиска текущему пользователю, исполняемые файлы и каталоги (в смысле разрешения имен файлов). При этом учитываются списки контроля доступа и другие артефакты разрешений, которые тест -perm игнорирует. Этот тест использует системный вызов access(2) и поэтому может выдать неправильный результат в случае использования серверов NFS, на которых выполняется сопоставление UID (или, на которых разрешен доступ только пользователю root). Дело в том, что многие клиентские системы применяют системный вызов access(2) из своего клиентского ядра и поэтому не могут использовать для сопоставления информацию UID, хранящуюся на сервере. Однако, поскольку этот тест основан только на результате системного вызова access(2), то нет никакой уверенности в том, что файл, для которого этот тест завершился успешно, действительно является таковым.

Всегда ложно.

Файл находится в файловой системе типа type. Допустимые типы файловых систем различаются в разных версиях Unix; неполный список типов файловых систем, которые могут быть в той или иной версии Unix, следующий: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. Вы можете использовать -printf с директивой %F, чтобы просмотреть типы ваших файловых систем.

Числовой идентификатор группы файла менее, более или точно равен n.

Файл принадлежит группе, именуемой gname (можно также использовать цифровой идентификатор группы).

Аналогично -lname, но соответствие не зависит от регистра. Если используется параметр -L или параметр -follow, то этот тест возвращает значение false, если только не нарушена символическая ссылка.

Аналогично -name, но соответствие не зависит от регистра. Например, шаблонам "fo*" и "F??" соответствуют файлы с именами "Foo", "FOO", "foo", "fOo", "fOo" и т.д. Шаблону "*foo*" также будет соответствовать файл с именем ".foobar".

Индексный дескриптор файла менее, чем n, более, чем n или равен n. Обычно проще использовать тест -samefile.

Аналогично -path, но при проверке соответствия регистр не учитывается.

Аналогично -regex, но при проверке соответствия регистр не учитывается.

Смотрите -ipath. Этот вариант менее переносим, чем -ipath.

Файл содержит менее, более или ровно n жестких ссылок.

Файл представляет собой символическую ссылку, содержимое которой соответствует шаблону оболочки pattern. Метасимволы не содержат специальных символов "/" или ".". Если указан параметр -L или параметр -follow, то этот тест возвращает значение false, если символическая ссылка не нарушена.

Данные файла были в последний раз изменены менее, более или ровно n минут назад.

Данные файла в последний раз изменялись менее, более или ровно 24 часа назад. Смотрите комментарии к -atime, чтобы узнать, как округление влияет на интерпретацию времени изменения файла.

Основное имя файла (т.е. путь с удаленными предшествующими каталогами) соответствует шаблону оболочки pattern. Поскольку предшествующие каталоги удалены, то имена файлов, которые проверяются на соответствие с -name, никогда не будут содержать косую черту, поэтому "-name a/b" никогда ничему не будет соответствовать (вероятно вместо этого, вам следует использовать -path ). При попытке сделать это, выдается предупреждение, если только не задана переменная окружения POSIXLY_CORRECT. Метасимволы ("*" "?" и "[]") в начале основного имени соответствуют "." (это изменение в утилите find-4.2.2; смотрите раздел СООТВЕТСТВИЕ СТАНДАРТАМ ниже). Чтобы игнорировать каталог и файлы, находящиеся в нем, используйте -prune вместо проверки каждого файла в дереве каталогов; смотрите пример в описании этого действия. Фигурные скобки не воспринимаются как что-то особенное, несмотря на то, что некоторые оболочки, включая Bash, придают фигурным скобкам особое значение в шаблонах оболочек. Сопоставление имен файлов выполняется с помощью библиотечной функции fnmatch(3). Не забудьте заключить шаблон в кавычки, чтобы защитить его от расширения оболочкой.

Время последнего изменения данных текущего файла является более поздним, чем время последнего изменения данных файла reference. Если reference является символической ссылкой и используется параметр -H или параметр -L, то всегда используется время последнего изменения данных файла, на который указывает символическая ссылка.

Выполняется успешно, если временная метка X рассматриваемого файла более новая, чем временная метка Y файла reference. Буквы X и Y могут быть любыми из следующего набора:

a Время доступа к файлу reference.
B Время создания файла reference.
c Время изменения статуса индексного дескриптора reference.
m Время изменения файла reference.
t reference интерпретируется непосредственно как время.

Некоторые комбинации недопустимы; например, недопустимо, чтобы X было t. Некоторые комбинации реализованы не во всех системах; например, B поддерживается не во всех системах. Если указана недопустимая или не поддерживаемая комбинация XY, то возникает фатальная ошибка. Спецификации времени интерпретируются как аргументы для параметра -d в GNU date. Если вы попытаетесь использовать время создания, указанное в файле-ссылке и время создания не будет определено, то появится сообщение о фатальной ошибке. Если вы укажете тест, который относится ко времени создания проверяемых файлов, то этот тест не будет выполнен для любых файлов, время создания которых неизвестно.

Ни одна группа не соответствует числовому идентификатору группы файла.

Ни один пользователь не соответствует числовому идентификатору пользователя файла.

Имя файла соответствует шаблону оболочки pattern. Метасимволы не содержат символов "/" или "." специально; так, например,
find . -path "./sr*sc"

выведет запись для каталога с именем ./src/misc (если таковой существует). Чтобы игнорировать всё дерево каталогов, используйте -prune вместо проверки каждого файла в дереве каталогов. Обратите внимание, что проверка соответствия шаблону применяется ко всему имени файла, начиная с одной из начальных точек, указанных в командной строке. Здесь имеет смысл использовать абсолютное имя пути только в том случае, если соответствующая начальная точка также является абсолютным путем. Это означает, что нижеприведённой команде никогда ничто не будет соответствовать:

find bar -path /foo/bar/myfile -print

Утилита find сравнивает аргумент -path с объединением имени каталога и основного имени проверяемого файла. Поскольку конкатенация никогда не заканчивается косой чертой, то аргументы -path, заканчивающиеся косой чертой, ничему не будут соответствовать (за исключением, возможно, начальной точки, указанной в командной строке). Предикат -path также поддерживается find HP-UX и является частью стандарта POSIX 2008.

Биты прав доступа для файла в точности соответствуют mode (в восьмеричной системе счисления или в символьной записи). Поскольку требуется точное соответствие, то если вы хотите использовать эту форму для символьной записи, вам, возможно, придется указать довольно сложную строку. Например, строка "-perm g=w" будет соответствовать только файлам, имеющим права доступа 0020 (то есть тем, для которых право доступа на групповую запись является единственным установленным правом доступа). Скорее всего вам лучше использовать формы "/" или "-", например, "-perm -g=w", которые соответствуют любому файлу с правом доступа на запись группы. Некоторые наглядные примеры приведены в разделе ПРИМЕРЫ.

Для файла заданы все биты прав доступа в mode. В этой форме принимаются символьные записи и обычно используется именно эта форма. Вы должны указать "u", "g" или "o", если вы используете символьную запись. Некоторые наглядные примеры приведены в разделе ПРИМЕРЫ.

Для файла заданы любые права доступа mode. В этой форме допускаются символьные записи. Вы должны указать "u", "g" или "o", если вы используете символьные записи. Некоторые наглядные примеры приведены в разделе ПРИМЕРЫ. Если в mode не заданы биты прав доступа, то этот тест соответствует любому файлу (смыл здесь заключается в том, чтобы соответствовать поведению -perm -000).

Это больше не поддерживается (и считается устаревшим с 2005 года). Вместо этого используйте -perm /mode.

Сопоставлять файлы, доступные для чтения текущему пользователю. При этом учитываются списки прав доступа и другие артефакты разрешений, которые тест -perm игнорирует. Этот тест использует системный вызов access(2) и поэтому может выдать неправильный результат в случае использования серверов NFS, на которых выполняется сопоставление UID (или, на которых разрешен доступ только пользователю root). Дело в том, что многие клиентские системы применяют системный вызов access(2) из своего клиентского ядра и поэтому не могут использовать для сопоставления информацию UID, хранящуюся на сервере. Однако, поскольку этот тест основан только на результате системного вызова access(2), то нет никакой уверенности в том, что файл, для которого этот тест завершился успешно, действительно является таковым.

Имя файла соответствует регулярному выражению pattern. Это совпадение по всему пути, а не поиск. Например, для сопоставления файла с именем ./fubar 3 можно использовать регулярное выражение ".*bar." или ".*b.*3", но не "f.*r3". Регулярные выражения, распознаваемые find по умолчанию, являются регулярными выражениями Emacs (за исключением того, что "." соответствует новой строке), но это можно изменить с помощью параметра -regextype.

Файл ссылается на тот же индексный дескриптор, что и файл name. Когда используется -L, это может содержать символические ссылки.

Файл занимает меньше, больше или ровно n единиц измерения пространства с округлением в большую сторону. Можно использовать следующие буквы:
"b"
для 512-байтовых блоков (это значение по умолчанию, если суффикс не используется);
"c"
для байтов;
"w"
для двух байтовых слов;
"k"
для килобайт (кб, единица измерения, равная 1024 байта);
"M"
для мегабайт (Мб, единица измерения, равная 1024 * 1024 = 1048576 байт);
"G"
для гигабайт (Гб, единица измерения, равная 1024 * 1024 * 1024 = 1073741824 байт).
Размер - это просто структурный элемент st_size, заполняемый системным вызовом lstat (или stat) и округленный в большую сторону, как показано выше. Другими словами, это согласуется с результатом, который вы получаете для ls -l. Имейте в виду, что спецификаторы формата "%k" и "%b" в -printf по-разному обрабатывают разреженные файлы. Буква "b" всегда обозначает 512-байтовые блоки и никогда не обозначает 1024-байтовые, что отличается от поведения -ls.
Символы "+" и "-", как обычно, означают "больше" и "меньше", т.е. точный размер n единиц измерения не совпадает. Имейте в виду, что размер округлен в большую сторону до следующей единицы измерения. Следовательно, -size -1M не эквивалентно -size -1048576c. Первое соответствует только пустым файлам, а второе соответствует файлам размером от 0 до 1 048 575 байт.
Всегда истинно.

Файл имеет тип c:
специальный блок (буферизованный);
специальный символ (не буферизованный);
каталог;
именованный канал (FIFO);
ф
обычный файл
символическая ссылка; это никогда не выполняется, если действует параметр -L или -follow, если только символическая ссылка не нарушена. Если вы хотите выполнить поиск символических ссылок, когда действует -L, то используйте -xtype;
socket
вход (Solaris).
Для поиска более чем одного типа одновременно вы можете ввести сводный список букв типа, разделенных запятой "," (расширение GNU).
Числовой идентификатор пользователя файла менее, более или точно равен n.

Последний раз к файлу обращались менее, более или ровно n дней после последнего изменения его статуса.

Файл принадлежит пользователю uname (допускается использование числового идентификатора пользователя).

Смотрите -path. Эта альтернатива менее переносима, чем -path.

Сопоставлять файлы, доступные для записи текущему пользователю. При этом учитываются списки прав доступа и другие артефакты прав доступа, которые тест -perm игнорирует. Этот тест использует системный вызов access(2) и поэтому может выдать неправильный результат в случае использования серверов NFS, на которых выполняется сопоставление UID (или, на которых разрешен доступ только пользователю root). Дело в том, что многие клиентские системы применяют системный вызов access(2) из своего клиентского ядра и поэтому не могут использовать для сопоставления информацию UID, хранящуюся на сервере. Однако, поскольку этот тест основан только на результате системного вызова access(2), то нет никакой уверенности в том, что файл, для которого этот тест завершился успешно, действительно является таковым.

То же, что и -type, если только файл не является символической ссылкой. Для символических ссылок: если был указан параметр -H или -P, значение истинно (true), если файл является ссылкой на файл типа c; если был указан параметр -L, то значение true, если c равно "l". Другими словами, для символических ссылок -xtype проверяет тип файла, который -xtype не проверяет.
Контекст безопасности файла соответствует glob pattern (glob - шаблон с подстановочными знаками). Примечание. Только для SELinux.

ДЕЙСТВИЯ

Удалить файлы или каталоги; если удаление завершилось успешно, возвращается true. Если удаление завершилось неудачно, выдается сообщение об ошибке и возвращаемое find значение будет отличным от нуля (когда find завершит работу).

Внимание: Не забывайте, что find анализирует командную строку как выражение, поэтому, когда в начале строки указано -delete, find попытается удалить всё, что находится ниже указанных вами начальных точек.

Использование действия -delete в командной строке автоматически включает параметр -depth. Поскольку, в свою очередь, -depth делает -prune неэффективным. Действие -delete не может быть объединено с -prune.

Часто пользователь может захотеть протестировать командную строку поиска с помощью -print, прежде чем добавить -delete для фактического удаления. Чтобы избежать неожиданных результатов, обычно лучше не забывать явно использовать -depth во время предыдущих тестовых запусков.

Действие -delete не приведет к удалению каталога, если он не будет пустым.

Вместе с параметром -ignore_readdir_race, find будет игнорировать ошибки действия -delete; в случае, если файл исчез с момента чтения родительского каталога, она не будет выводить диагностику ошибки, не изменит код завершения на ненулевой и код возврата из родительского каталога. Действие -delete будет выполнено верно.

-exec command ;
Это действие запускает выполнение команды command; если будет возвращено значение 0, то команда выполнена успешно. Все последующие аргументы утилиты find принимаются в качестве аргументов команды, пока не будет найден аргумент, состоящий из ";". Строка "{}" заменяется текущим именем файла, которое обрабатывается везде, где оно встречается в аргументах команды, а не только в аргументах, где оно присутствует отдельно, как в некоторых версиях find. Обе эти конструкции, возможно, потребуется экранировать (с помощью "\") или заключить в кавычки, чтобы защитить их от расширения оболочкой. Примеры использования действия -exec приведены в разделе ПРИМЕРЫ. Указанная команда выполняется один раз для каждого сопоставляемого файла. Команда выполняется в начальной директории. Использование действия -exec неизбежно связано с проблемами безопасности; вместо этого следует использовать действие -execdir.

-exec command {} +
Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления имени каждого выбранного файла в конце; общее количество вызовов команды будет намного меньше, чем количество сопоставляемых файлов. Командная строка построена во многом таким же образом, как и командная строка xargs. В команде можно указать только один экземпляр "{}" и он должен отображаться в конце, непосредственно перед символом "+"; этот экземпляр необходимо экранировать (с помощью "\") или заключить в кавычки, чтобы защитить его от интерпретации командной оболочкой. Команда выполняется в начальном каталоге. Если какой-либо вызов с форматом "+" возвращает ненулевое значение, то find возвращает также ненулевое значение. Если find обнаруживает ошибку, то это иногда может привести к немедленному завершению работы, поэтому некоторые ожидающие выполнения команды могут быть вообще не выполнены. По этой причине -exec my-command ... {} + -quit может не привести к выполнению my-command. Этот вариант -exec всегда возвращает значение true (истинно).

Эти действия аналогичны действию -exec, но указанная команда запускается из подкаталога, содержащего соответствующий файл, который обычно не является каталогом, в котором вы запускали find. Как и в случае с -exec, фигурные скобки {} следует заключать в кавычки, если find вызывается из командной строки. Это гораздо более безопасный метод вызова команд, поскольку он позволяет избежать проблем при определении путей к соответствующим файлам. Как и в случае с действием -exec, форма "+" в -execdir создаст командную строку для обработки более чем одного соответствующего файла, но при любом вызове command будут перечислены только те файлы, которые существуют в том же подкаталоге. Если вы используете это действие, то вы должны убедиться, что ваша переменная окружения PATH не ссылается на "."; в противном случае злоумышленник может запускать любые команды, которые он захочет, оставляя файл с соответствующим именем в каталоге, в котором вы будете запускать -execdir. То же самое относится и к наличию записей в PATH, если они являются пустыми или не являются абсолютными именами каталогов. Если какой-либо вызов с форматом "+" возвращает ненулевое значение, то find возвращает также ненулевое значение. Если find обнаруживает ошибку, то это иногда может привести к немедленному завершению, поэтому некоторые ожидающие выполнения команды могут быть не выполнены. Результат этого действия зависит от того, используется ли вариант + или ;. Вариант -execdir command {} + всегда возвращает значение true, в то время как вариант -execdir command {} ; возвращает значение true только в том случае, если command возвращает 0.

Истинно (True). Аналогично -ls, но запись в file выполняется как -fprintf. Выходной файл создается всегда, даже если для предиката нет соответствия. Смотрите раздел НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Истинно. Вывести полное имя файла в файл file. Если файл file не существует при запуске find, то он создается; если он существует, то он обрезается. Имена файлов /dev/stdout и /dev/stderr обрабатываются особым образом; они относятся к стандартному выводу и стандартной ошибке, соответственно. Выходной файл создается всегда, даже если для предиката нет соответствия. Информацию о том, как обрабатываются необычные символы в именах файлов, смотрите в разделе НЕОБЫЧНЫЕ ИМЕНА файлов.

Истинно. Аналогично -print 0, но запись в file выполняется как -fprintf. Выходной файл создается всегда, даже если для предиката нет соответствия. Смотрите раздел НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Истинно. Аналогично -printf, но запись в file также как -fprintf. Выходной файл создается всегда, даже если для предиката нет соответствия. Смотрите раздел НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Истинно. Вывести текущий файл в формате ls -dils на стандартный вывод. Количество блоков равно 1 КБАЙТ, если только не задана переменная окружения POSIXLY_CORRECT, в этом случае используются 512-байтовые блоки. Смотрите раздел НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Аналогично -exec, но сначала спросить пользователя. Если пользователь согласен, то выполнить команду. В противном случае просто возвратить значение "ложно" (false). Если команда выполняется, то ее стандартный ввод перенаправляется с /dev/null. Это действие может не указываться вместе с параметром -files0-from.

Ответ на запрос сопоставляется с парой регулярных выражений, чтобы определить, является ли он положительным или отрицательным. Это регулярное выражение получается из системы, если задана переменная среды POSIXLY_CORRECT или иным образом из трансляции сообщений find. Если в системе нет подходящего определения, то будет использовано собственное определение find. В любом случае на интерпретацию самого регулярного выражения будут влиять переменные окружения LC_CTYPE (классы символов) и LC_COLLATE (диапазоны символов и классы эквивалентности).

Аналогично -execdir, но сначала запросить пользователя таким же образом, как и для -ok. Если пользователь не согласен, то просто возвратить false. Если команда выполняется, то ее стандартный ввод перенаправляется с /dev/null. Это действие может не указываться вместе с параметром -files0-from.

Истинно. Вывести полное имя файла на стандартный вывод и после этого ввести новую строку. Если вы передаете выходные данные find в другую программу и существует малейшая вероятность того, что файлы, которые вы ищете, могут содержать новую строку, то вам следует серьезно подумать об использовании параметра -print0 вместо -print. Смотрите раздел НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Истинно. Вывести полное имя файла на стандартный вывод, за которым следует нулевой символ (вместо символа новой строки, который используется -print). Это позволяет программам, обрабатывающим выходные данные find и корректно интерпретировать имена файлов, содержащие символы новой строки или другие типы пробелов. Этот параметр совпадает с параметром -0 в xargs.

Истинно. Вывести format на стандартный вывод, избегая интерпретации "\" и директивы "%". Ширина и точность полей могут быть заданы как с помощью функции С printf(3). Пожалуйста, обратите внимание, что многие поля выводятся как %s, а не %d, а это может означать, что флажки работают не так, как вы ожидаете. Это также означает, что флаг "-" действительно работает (он приводит к выравниванию полей по левому краю). В отличие от -print, -printf не добавляет новую строку в конец строки. Экранирующими элементами и директивами являются:
Сигнал тревоги должен быть.
Возврат.
Немедленно прекратить вывод в этом формате и очистить выходные данные.
Подача формы.
Новая строка
Возврат каретки.
Горизонтальная табуляция.
Вертикальная табуляция.
\0
ЗНАЧЕНИЕ ASCII РАВНО НУЛЮ.
\\
Литерал обратная косая черта ("\").
Символ, ASCII, код которого равен NNN (восьмеричное число).

Символ "\", за которым следует любой другой символ, который воспринимается как обычный символ и поэтому они оба выводятся.

%%
Литерал знак процента.
%a
Время последнего доступа к файлу в формате, возвращаемом функцией C c time(3).
%Ak
Время последнего доступа к файлу в формате, указанном с помощью k, которое является либо "@", либо директивой для функции C strftime(3). Ниже приведен неполный список возможных значений для k. Пожалуйста, ознакомьтесь с документацией по strftime(3) для получения полного списка. Некоторые символы спецификации преобразования могут быть доступны не во всех системах из-за различий в реализации библиотечной функции strftime(3).
@
секунды с января. 1, 1970, 00:00 По Гринвичу, с дробной частью.

Поля времени:

часы (00..23)
часы (01..12)
к
часы ( 0,..,23);
часы ( 1,..,12);
минуты (00..59)
местное время до полудня (AM) или после полудня (PM);
время, 12 часов (чч:мм:сс [AP]M);
Секунды (00.00 ,.., 61.00); здесь есть дробная часть.
Т
время, 24 часа (чч:мм:сс.xxxxxxxxxx).
+
Дата и время, разделенные знаком "+", например `2004-04-28+22:22:05.0'; это расширение GNU; время указано в текущем часовом поясе (на это может повлиять установка переменной среды TZ); поле секунды содержит дробную часть.
представление местного времени (Ч:М:С); поле секунды содержит дробную часть.
З
часовой пояс (например, EDT) или ничего, если часовой пояс не определён.

Поля даты:

сокращенное название дня недели в регионе (Sun,..,Sat).
полное название дня недели в локали с переменной длиной (Sunday,..,Saturday).
сокращенное название месяца в регионе (Jan,..,Dec).
полное название месяца в языковом стандарте с переменной длиной (January,..,December).
дата и время в соответствии с местным стандартом (Sat Nov 04 12:02:33 EST 1989 1989); формат такой же, как для ctime(3), поэтому для обеспечения совместимости с этим форматом в поле секунды нет дробной части.
сутки месяца (01..31).
дата (мм/дд/гг).
дата (гггг-мм-дд).
г
то же, что и b.
номер дня в году (001..366)
месяц (01..12)
номер недели в году с воскресеньем в качестве первого дня недели (00,..,53).
день недели (0,..,6).
номер недели в году с понедельником в качестве первого дня недели (00,..,53).
представление даты в локали (мм/дд/гг).
и
две последние цифры года (00..99)
И
год (1970,...,).
%b
Размер дискового пространства, используемого для этого файла, выражен в 512-байтовых блоках. Поскольку размер дискового пространства кратен размеру блока файловой системы, то это значение обычно больше, чем %s/512, но оно также может быть меньше, если файл является разреженным.

%Bk
Время создания файла, в формате, указанном параметром k, который совпадает с %A. Эта директива выдает пустую строку, если базовая операционная система или файловая система не поддерживает время создания.

%c
Время последнего изменения статуса файла в формате, возвращаемом функцией C ctime(3).
%Ck
Время последнего изменения статуса файла в формате, указанном в k, который совпадает с %A.
%d
Местоположение файла в дереве каталогов; 0 означает, что файл является начальной точкой.
%D
Номер устройства, на котором существует файл (поле st_dev в struct stat), в десятичной системе счисления.
%f
Вывод основного имени файла; то есть имени файла с удалением всех предшествующих его имени каталогов (только последний элемент). Для / результатом будет "/". Смотрите пример в разделе ПРИМЕРЫ.

%F
Тип файловой системы, в которой находится файл; это значение можно использовать для -fstype.
%g
Имя группы файла или цифровой идентификатор группы, если у группы нет имени.
%G
Цифровой идентификатор группы файла.
%h
Имя каталога; предшествующие имени файла каталоги (все, кроме последнего элемента). Если имя файла не содержит косых черт (поскольку он находится в текущем каталоге), то спецификатор %h расширяется до ".". Для файлов, которые сами являются каталогами и содержат косую черту (включая /), %h расширяется до пустой строки. Смотрите пример в разделе ПРИМЕРЫ.
%H
Начальная точка, под которой был найден файл.
%i
Индексный дескриптор файла (в десятичной системе счисления).
%k
Размер дискового пространства, используемого для этого файла, указывается в блоках размером 1 Кб. Поскольку размер дискового пространства кратен размеру блока файловой системы, это значение обычно больше, чем %s/1024, но может быть и меньше, если файл является разреженным.
%l
Объект символической ссылки (пустая строка, если файл не является символической ссылкой).
%m
Разряды прав доступа для файла (в восьмеричном формате). В этом параметре используются "традиционные" числа, которые используются в большинстве реализаций Unix, но если в вашей конкретной реализации используется необычный порядок разрядов прав доступа в восьмеричном формате, то вы увидите разницу между фактическим значением прав доступа файла и выходным значением %m. Обычно вам нужно, чтобы в начале этого числа был ноль и для этого вам следует использовать флаг # (например, "%#m").
%M
Права доступа к файлу (в символическом формате, как для ls). Эта директива поддерживается в утилите find 4.2.5 и более поздних версиях.
%n
Количество жестких ссылок на файл.
%p
Имя файла.
%P
Имя файла с указанием начальной точки, под которой он был найден, будет удалено.
%s
Размер файла в байтах.
%S
Разреженность файла. Это значение рассчитывается как (РАЗМЕР БЛОКА*st_blocks / st_size). Точное значение, которое вы получите для обычного файла определенного размера, зависит от системы. Однако обычно разреженные файлы имеют значения меньше 1,0, а файлы, использующие косвенные блоки, могут иметь значение, превышающее 1,0. Как правило, количество блоков, используемых файлом, зависит от файловой системы. Значение, используемое для размера блока, зависит от системы, но обычно составляет 512 байт. Если размер файла равен нулю, выводимое значение не определено. В системах, в которых отсутствует поддержка st_blocks, предполагается, что разреженность файла равна 1,0.
%t
Время последнего изменения файла в формате, возвращаемом функцией C ctime(3).
%Tk
Время последнего изменения файла в формате, указанном в k, которое совпадает с временем %A.
%u
Имя пользователя файла или цифровой идентификатор пользователя, если у пользователя нет имени.
%U
Цифровой идентификатор пользователя файла.
%y
Тип файла (как в ls -l), U=неизвестный тип (этого не должно быть).
%Y
Тип файла (например, %y), а также переход по символической ссылке: "L"=цикл, "N"=несуществующий, "?" для любой другой ошибки при определении типа целевой символической ссылки.
%Z

Контекст безопасности файла (только для SELinux).
%{ %[ %(
Зарезервировано для использования в будущем.

Символ "%", за которым следует любой другой символ, отбрасывается, но выводится другой символ (не полагайтесь на это, так как могут быть введены дополнительные символы формата). Символ "%" в конце аргумента "format" приводит к неопределенному поведению, поскольку следующий символ отсутствует. В некоторых местах он может спрятать ключи от вашего входа, в то время как в других может удалить последнюю страницу из романа, который вы читаете.

Директивы %m и %d поддерживают флаги #, 0 и +, но другие директивы этого не делают, даже если они выводят числа. Числовые директивы, которые не поддерживают эти флаги, включают G, U, b, D, k и n. Поддерживается флаг формата "-", который изменяет выравнивание поля с выравнивания по правому краю (которое используется по умолчанию) на выравнивание по левому краю.

Смотрите раздел НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ для получения информации о том, как обрабатываются необычные символы в именах файлов.

Истинно. Если файл является каталогом, не заходить в него. Если указано -depth, то -prune не имеет значения. Поскольку -delete подразумевает -depth, вы не можете эффективно использовать -prune и -delete вместе. Например, чтобы пропустить каталог src/emacs и все файлы и каталоги под ним и вывести имена других найденных файлов, выполните что-то вроде этого:
find . -path ./src/emacs -prune -o -print

Немедленно завершить работу (возвращается нулевое значение, если ошибок не произошло). Это отличается от -prune, поскольку -prune применяется только к содержимому удаленных каталогов, в то время как -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). Этот символ ("!") также обычно нуждается в защите от интерпретации командной оболочкой.

То же, что и ! expr, но не совместимо с POSIX.

Два выражения подряд объединяются подразумеваемым оператором -a (логическое И); значение expr2 не вычисляется, если значение expr1 "ложно" (false).

То же, что и expr1 expr2.

То же, что и expr1 expr2, но не совместимо с POSIX.

Логическое ИЛИ; expr2 не вычисляется, если expr1 имеет значение "истинно" (true).

То же, что и expr1 -o expr2, но не совместимо с POSIX.

Список; всегда вычисляется как expr1 и expr2. Значение expr1 отбрасывается; значением списка является значение expr2. Оператор запятая может использоваться для поиска нескольких различных типов объектов, но только один раз при перемещении по иерархии файловой системы. Действие -fprintf можно использовать для составления списка различных совпадающих элементов в нескольких разных выходных файлах.

Обратите внимание, что оператор -a, если он указан неявно (например, в двух тестах, которые отображаются без явного оператора между ними) или явно, имеет более высокий приоритет, чем оператор -o. Это означает, что find . -name afile -o -name bfile -print никогда не выведет afile.

НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ

Многие действия find приводят к выводу данных, которые находятся под контролем других пользователей. Это относится к именам файлов, их размерам, время изменения и так далее. Имена файлов представляют потенциальную проблему, поскольку они могут содержать любые символы, кроме "\0" и "/". Необычные символы в именах файлов могут привести к неожиданным и зачастую нежелательным последствиям для вашего терминала (например, к изменению настроек функциональных клавиш на некоторых терминалах). Различные действия с необычными символами выполняются по-разному, как это описано ниже.

Всегда выводит, без изменений, точное имя файла, даже если выходные данные поступают на терминал.

Необычные символы всегда экранируются. Символы пробела, обратной косой черты и двойных кавычек выводятся с использованием экранирования в стиле языка программирования С (например, "\f", "\"). Другие необычные символы выводятся с использованием восьмеричного отступа. Другие выводимые символы (для -ls и -fls это символы между восьмеричными цифрами 041 и 0176) выводятся как есть.

Если выходные данные не поступают на терминал, то они выводятся как есть. В противном случае результат зависит от используемой директивы. Директивы %D, %F, %g, %G, %H, %Y и %y расширяются до значений, которые не контролируются владельцами файлов и поэтому выводятся как есть. Директивы %a, %b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u и %U имеют значения, которые находятся под контролем владельцев файлов, но которые нельзя использовать для отправки произвольных данных на терминал и таким образом они выводятся как есть. Директивы %f, %h, %l, %p и %Pp указываются в кавычках. Это заключение в кавычки выполняется таким же образом, как и для ls GNU. Это не тот механизм заключения в кавычки, который используется для -ls и -fls. Если вы в состоянии решить, какой формат использовать для вывода find, то обычно лучше использовать "\0" в качестве символа завершения, нежели использовать новую строку, поскольку имена файлов могут содержать пробелы и символы новой строки. Значение переменной окружения LC_CTYPE используется для определения того, какие символы должны быть заключены в кавычки.

Кавычки обрабатываются так же, как и для -printf и -fprintf. Если вы используете find в скрипте или в ситуации, когда сопоставляемые файлы могут иметь произвольные имена, то вам следует рассмотреть возможность использования -print0 вместо -print.

Действия -ok и -okdir выводят текущее имя файла как есть. Это может измениться в следующем выпуске.

СООТВЕТСТВИЕ СТАНДАРТАМ

Для обеспечения максимального соответствия стандарту POSIX необходимо задать переменную окружающей среды POSIXLY_CORRECT. В стандарте POSIX (IEEE Std 1003.1-2008, редакция 2016 года) указаны следующие параметры:

-H
Этот параметр поддерживается.

-L
Этот параметр поддерживается.

Этот параметр поддерживается, но соответствие POSIX зависит от соответствия POSIX системной библиотечной функции fnmatch(3). Начиная с версии утилиты find-4.2.2 метасимволы оболочки (например, "*", "?" или "[]") соответствуют началу ".", поскольку этого требует интерпретация IEEE PASC 126. Это изменение, по отношению к предыдущим версиям утилиты find.

Поддерживается. POSIX определяет "b", "c", "d", "l", "p", "f" и "s". GNU find также поддерживается "D", обозначающее вход, в том размере, в котором это обеспечивается операционной системой. Кроме того, GNU find позволяет указывать сразу несколько типов в списке, разделенном запятыми.

Поддерживается. Интерпретация ответа производится в соответствии с шаблонами "да" ("yes") и "нет" ("no" ), выбранными путем установки переменной окружения LC_MESSAGES. Когда задана переменная окружения POSIXLY_CORRECT, то эти шаблоны используются для определения системой положительного ответа (да) или отрицательного ответа (нет). Смотрите системную документацию для nl_langinfo(3), в частности, для YESEXPR и NOEXPR. Если переменная окружения POSIXLY_CORRECT не определена, то вместо этого шаблоны берутся из собственного каталога сообщений find.

Поддерживается. Если указанный файл является символической ссылкой, то он всегда разыменовывается. Это изменение по сравнению с предыдущим поведением, при котором для использования символической ссылки требовалось соответствующее время. Смотрите раздел "ИСТОРИЯ" ниже.

Поддерживается. Если переменная окружения POSIXLY_CORRECT не задана, то для обеспечения обратной совместимости поддерживаются некоторые аргументы режима (например, +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 обнаруживала циклы:

Утилита find должна обнаруживать бесконечные циклы, то есть вводить ранее посещенный каталог, который является предком последнего обнаруженного файла. При обнаружении бесконечного цикла find выдаст диагностическое сообщение на вывод стандартных ошибок и либо восстановит свою позицию в иерархии каталогов, либо завершит работу.

GNU find соответствует этим требованиям. Количество ссылок в каталогах, содержащих записи, которые являются жесткими ссылками на предка, часто бывает ниже, чем должно быть в противном случае. Это может означать, что GNU find иногда оптимизирует доступ к подкаталогу, который на самом деле является ссылкой на предок. Поскольку find на самом деле не входит в такой подкаталог, можно избежать выдачи диагностического сообщения. Хотя такое поведение может несколько сбивать с толку, маловероятно, что что-то на самом деле зависит от такого поведения. Если итоговая оптимизация была отключена с помощью параметра -noleaf, то запись в каталоге всегда будет проверяться и при необходимости будет выдаваться диагностическое сообщение. Символические ссылки не могут использоваться для создания циклов файловой системы как таковых, но если используется параметр -L или параметр -follow, то диагностическое сообщение выдается, когда find обнаруживает цикл символических ссылок. Как и в случае с циклами, содержащими жесткие ссылки, итоговая оптимизация часто означает, что find знает, что не нужно вызывать stat() или chdir() для символической ссылки, поэтому такая диагностика часто не требуется.

Параметр -d поддерживается для обеспечения совместимости с различными системами BSD, но вместо него следует использовать, совместимый с POSIX, параметр -depth.

Переменная окружения POSIXLY_CORRECT не влияет на поведение тестов -regex или -iregex, поскольку эти тесты не указаны в стандарте POSIX.

ПЕРЕМЕННЫЕ СРЕДЫ ОКРУЖЕНИЯ

Предоставляет значение по умолчанию для переменных интернационализации, которые не установлены или равны нулю.

Если задано непустое строковое значение, переопределяет значения всех остальных переменных интернационализации.

Стандарт POSIX определяет, что эта переменная влияет на сопоставление с шаблоном, которое будет использоваться для параметра -name. GNU find использует библиотечную функцию fnmatch(3) и поэтому поддержка LC_COLLATE зависит от системной библиотеки. Эта переменная также влияет на интерпретацию ответа на -ok; в то время как переменная LC_MESSAGES выбирает фактический шаблон, используемый для интерпретации ответа на -ok, интерпретация любых выражений в скобках в шаблоне будет зависеть от LC_COLLATE.

Эта переменная влияет на обработку классов символов, используемых в регулярных выражениях, а также на проверку -name, если системная библиотечная функция fnmatch(3) это поддерживает. Эта переменная также влияет на интерпретацию любых классов символов в регулярных выражениях, используемых для интерпретации ответа на запрос, выданный командой -ok. Переменная окружения LC_CTYPE также влияет на то, какие символы считаются непечатаемыми при выводе имен файлов; смотрите раздел "НЕОБЫЧНЫЕ ИМЕНА ФАЙЛОВ".

Определяет языковой стандарт, который будет использоваться для интернационализированных сообщений. Если задана переменная окружения POSIXLY_CORRECT, то она также определяет интерпретацию ответа на запрос, вызванный действием -ok.

Определяет расположение каталогов интернационализационных сообщений.

Влияет на каталоги, в которых выполняется поиск исполняемых файлов, вызываемых -exec, -execdir, -ok и -okdir.

Определяет размер блока, используемый параметрами -ls и -fls. Если задано значение POSIXLY_CORRECT, то блоки будут иметь размер 512 байт. В противном случае они будут иметь размер 1024 байта.
Установка этой переменной также отключает предупреждающие сообщения (то есть подразумевается -nowarn) по умолчанию, поскольку POSIX требует, чтобы, кроме вывода для -ok, все сообщения, выводимые в стандартный поток ошибок (stderr), были диагностическими и должны приводить к ненулевому статусу завершения.
Когда значение POSIXLY_CORRECT не задано, значение -perm +zzz обрабатывается точно так же, как значение -perm /zzz, если значение +zzz не является допустимым в символическом режиме. Когда задано значение POSIXLY_CORRECT, такие конструкции обрабатываются как ошибка.
Когда задан параметр POSIXLY_CORRECT, то ответ на запрос, вызванный действием -ok, интерпретируется в соответствии с системным каталогом сообщений, а не в соответствии с собственными трансляциями сообщений find.

Влияет на часовой пояс, используемый для некоторых связанных со временем директив формата -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 выполняет предварительную фильтрацию и создает огромный список файлов, разделенных НУЛЁМ, обработать список как начальные точки и найти в нём все обычные пустые файлы:

$ proggy | find -files0-from - -maxdepth 0 -type f -empty
Использование "-files0-from -" означает чтение имен начальных точек из standard input, т.е. из стандартного ввода, а -maxdepth 0 гарантирует, что только эти записи будут проверены явно, без обращения к каталогам (в том случае, когда одна из начальных точек является единственной).

Выполнение команды для каждого файла

Выполнить file для каждого файла в текущем каталоге или под ним.

$ find . -type f -exec file '{}' \;
Обратите внимание, что фигурные скобки заключены в одинарные кавычки, чтобы защитить их от интерпретации как знаков препинания в сценарии оболочки. Точка с запятой также защищена обратной косой чертой, хотя в этом случае также можно было бы использовать одинарные кавычки.

Во многих случаях можно предпочесть синтаксис `-exec ... +` или, что еще лучше, `-execdir ... +` по соображениям производительности и безопасности.

Перемещение по файловой системе (для выполнения 2-х различных действий) только один раз

Пройти по файловой системе всего один раз, поместив файлы и каталоги с установленными идентификаторами пользователя в /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' \)

В этом примере используется символ продолжения строки '\' в первых двух строках, чтобы указать командной оболочке продолжить чтение команды в следующей строке.

Поиск файлов по времени создания

Найти в вашем домашнем каталоге файлы, которые были изменены за последние двадцать четыре часа.

$ find $HOME -mtime 0
Эта команда работает таким образом, потому что время с момента последнего изменения каждого файла отделено более чем на 24 часа, а оставшееся время отбрасывается. Это означает, что для соответствия -mtime 0 файл должен был быть изменен менее чем 24 часа назад.

Поиск файлов по правам доступа

Найти файлы, которые являются исполняемыми, но не доступными для чтения.

$ find /sbin /usr/sbin -executable \! -readable -print
Найти файлы, которые имеют разрешение на чтение и запись для их владельца и группы и которые другие пользователи могут читать, но не могут записывать.

$ find . -perm 664
Файлы, которые соответствуют этим критериям, но имеют другие установленные биты прав доступа (например, если кто-то может запустить файл), не будут соответствовать этим критериям.
Найти файлы, которые имеют разрешение на чтение и запись для их владельца и группы и которые могут читать другие пользователи, независимо от наличия каких-либо дополнительных разрешений (например, бита исполняемого файла).

$ find . -perm -664
Здесь будут соответствовать критерию файлы, которые, например, имеют права доступа 0777.
Найти файлы, которые доступны для записи кому-либо (их владельцу, его группе или кому-либо еще).

$ find . -perm /222
Найти файлы, доступные для записи их владельцу или группе владельца.

$ find . -perm /220 $ find . -perm /u+w,g+w $ find . -perm /u=w,g=w
Все три эти команды выполняют одно и то же, но первая использует восьмеричное представление прав доступа, а две другие - символьную форму прав доступа. Для сопоставления файлов необязательно, чтобы они были доступны для записи как владельцу, так и его группе; подойдет любая из них.
Найти файлы, доступные для записи как их владельцу, так и группе владельца.

$ 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, соответственно).

Обрезка - исключение файлов и подкаталогов

Скопировать содержимое /source-dir в /dest-dir, но пропустить файлы и каталоги (и все, что в них находится) с именем .snapshot . Она также пропускает файлы или каталоги, имена которых заканчиваются на "~", но не их содержимое.

$ cd /source-dir $ find . -name .snapshot -prune -o \( \! -name '*~' -print0 \) \

| cpio -pmd0 /dest-dir

Конструкция -prune -o \( ... -print0 \) довольно распространена. Смысл здесь заключается в том, что выражение перед -prune соответствует объектам, которые необходимо обрезать. Однако само действие -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]

КОД ЗАВЕРШЕНИЯ

Утилита find завершает работу со статусом 0, если все файлы обработаны успешно и со статусом, превышающим 0, если возникают ошибки. Это намеренно очень общее описание, но если возвращаемое значение не равно нулю, вам не следует полагаться на правильность результатов find.

При возникновении какой-либо ошибки find может немедленно остановиться, не выполнив всех указанных действий. Например, возможно, не будут проверены некоторые начальные точки или не будут выполнены некоторые ожидающие вызова программы для -exec ... {} + или -execdir ... {} +.

ИСТОРИЯ

Начиная с версии утилиты find-4.2.2, метасимволы оболочки (например, "*", "?" или "[]"), используемые в шаблонах имен файлов, соответствуют началу ".", поскольку этого требует интерпретация IEEE POSIX 126.

Начиная с версии утилиты find-4.3.3, -perm /000 теперь соответствует всем файлам, а не ни одному.

Временные метки с наносекундным разрешением были реализованы в утилите find-4.3.3.

Начиная с версии утилиты find-4.3.11, действие -delete устанавливает статус завершения find в ненулевое значение в случае сбоя. Однако, find не завершится немедленно. Ранее сбой действия -delete не влиял на статус завершения find.

Функциональная возможность Добавлено в Тоже реализовано в
-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 был удален в утилите find-4.5.12 в интересах -perm /MODE. Синтаксис +MODE устарел начиная с версии утилиты find-4.2.21, которая была выпущена в 2005 году.

НЕ ОШИБКИ

Сюрпризы в отношении приоритета операторов

Команда find . -name afile -o -name bfile -print никогда не сделает вывод afile, потому что это на самом деле эквивалентно команде find . -name afile -o \( -name bfile -a -print \). Помните, что приоритет оператора -a является более высоким, чем оператора -o и когда между тестами не указан оператор, то предполагается, что это оператор -a.

“paths должны предшествовать expression” error message

$ find . -name *.c -print
find: paths must precede expression
find: possible unquoted pattern after predicate `-name'?

Это происходит, когда оболочка может расширить шаблон *.c для более чем одного имени файла, существующего в текущем каталоге и передать результирующие имена файлов в командной строке в find следующим образом:

find . -name frcode.c locate.c word_io.c -print

Эта команда, конечно, не выполнится, потому что предикат -name допускает только один шаблон в качестве аргумента. Вместо того, чтобы делать все таким образом, вам следует заключить шаблон в кавычки или экранировать подстановочный знак, что позволит find использовать шаблон с подстановочным знаком во время поиска совпадающих имен файлов вместо имен файлов, расширяемых родительской оболочкой:

$ find . -name '*.c' -print
$ find . -name \*.c -print

ОШИБКИ

В поведении, которое стандарт POSIX определяет для find, есть проблемы с безопасностью, которые, следовательно, не могут быть исправлены. Например, действие -exec по своей сути небезопасно и вместо него следует использовать -execdir.

Переменная окружения LC_COLLATE не влияет на действие -ok.

ИНФОРМАЦИЯ ОБ ОШИБКАХ

Онлайн-справка GNU по утилите find: <https://www.gnu.org/software/findutils/#get-help>
Сообщайте обо всех ошибках перевода по адресу <https://translationproject.org/team/ru.html>

Сообщайте о любых других проблемах через форму на сайте отслеживания ошибок GNU Savannah:

Основные темы, касающиеся пакета утилиты GNU find, обсуждаются в списке рассылки bug-findutils:

АВТОРСКИЕ ПРАВА

Авторское право ©, 1990-2022, Free Software Foundation, Inc. Лицензия GPLv3+: GNU GPL версия 3 или позднее <https://gnu.org/licenses/gpl.html>.
Это свободное программное обеспечение: вы можете изменять и распространять его. Не предоставляется НИКАКИХ ГАРАНТИЙ в той мере, в которой это разрешено законом.

СМОТРИТЕ ТАКЖЕ

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

ПЕРЕВОД

Русский перевод этой страницы руководства разработал(и) Aleksandr Felda <isk8da@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.