Страница Справочника find.1

 

FIND(1) Справочник основных команд FreeBSD FIND(1)

 

НАЗВАНИЕ

find -- обход иерархии файлов

 

СИНТАКСИС

find [-H | -L | -P] [-EXdsx] [-f путь] путь ... выражение

find [-H | -L | -P] [-EXdsx] -f путь [путь ...] выражение

 

ОПИСАНИЕ

Утилита find рекурсивно спускается по дереву каталогов каждого пути, ука-

занного аргументами путь, вычисляя выражение (состоящее из перечисленных

ниже ``примитивов'' и ``операндов'') для каждого файла в дереве.

 

Имеются следующие опции:

 

-E Интерпретировать регулярные выражения в примитивах -regex и

-iregex как расширенные (современные) регулярные выражения вместо

базовых регулярных выражений (BRE). Страница справочника

re_format(7) полностью описывает оба формата.

 

-H Возвращать информацию о файле и его типе (см. stat(2)) для фай-

лов, на которые указывают заданные в командной строке символиче-

ские ссылки, а не для самих ссылок. Если файл, на который указы-

вает ссылка, не существует, информация о файле и его типе будет

возвращена для самой ссылки. Информация о файлах для символиче-

ских ссылок не из командной строки будет возвращаться для самих

ссылок.

 

-L Возвращать информацию о файле и его типе (см. stat(2)) для фай-

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

ссылок. Если файл, на который указывает ссылка, не существует,

информация о файле и его типе будет возвращена для самой ссылки.

 

Эта опция эквивалентна устаревшему примитиву -follow.

 

-P Возвращать информацию о файле и его типе (см. stat(2)) для каждой

символической ссылки о самой ссылке. Это поведение по умолчанию.

 

-X Позволить безопасное использование find совместно с xargs(1).

Если имя файла содержит любой из символов-разделителей, использу-

емых xargs(1), вывести диагностическое сообщение в стандартный

файл ошибок и пропустить файл. Символы-разделители включают в

себя одиночные (`` ' '') и двойные (`` " '') кавычки, обратную

косую черту (``\''), пробел, табуляцию и символ перевода строки.

 

Однако вы можете использовать примитив -print0 совместно с

``xargs -0'' как эффективную альтернативу.

 

-d Заставить find производить обход сначала в глубину, т.е. каталоги

проходятся в пост-порядке, и все элементы каталога обрабатываются

перед самим каталогом. По умолчанию, find проходит каталоги в

пред-порядке, т.е. перед их содержимым. Следует отметить, что

этот режим по умолчанию не является обходом сначала в ширину.

 

Эта опция эквивалентна примитиву -depth из IEEE Std 1003.1-2001

(``POSIX.1''). Опция -d может быть полезной, когда find исполь-

зуется совместно с cpio(1) для обработки файлов в каталогах с

необычными правами доступа. Она обеспечивает вам право на

запись, пока вы помещаете файлы в каталог, a затем, в последнюю

очередь, устанавливает права доступа каталога.

 

-f Указать find файловую иерархию для обхода. Файловые иерархии

также могут быть указаны как операнды непосредственно следом за

опциями.

 

-s Заставить find обходить файловые иерархии в лексикографическом

порядке, т.е. в алфавитном порядке в каждом каталоге. Примеча-

ние: `find -s' и `find | sort' могут давать разные результаты.

 

-x Запретить find спускаться в каталоги, имеющие номер устройства,

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

 

Эта опция эквивалентна устаревшему примитиву -xdev.

 

ПРИМИТИВЫ

-Bmin n

Истинен, если разница между временем создания индексного дескрип-

тора (inode) файла и временем запуска find, округлённая до следу-

ющей полной минуты, равна n минут.

 

-Bnewer файл

То же, что и -newerBm.

 

-Btime n[smhdw]

Если единицы времени не указаны, то этот примитив истинен, если

разница между временем создания индексного дескриптора (inode)

файла и временем запуска find, округлённая до следующего полного

24-часового периода, составляет n 24-часовых периодов.

 

Если единицы времени указаны, то этот примитив истинен, если раз-

ница между временем создания индексного дескриптора (inode) файла

и временем запуска find в точности равна n единиц. Обратитесь к

описанию примитива -atime для информации о поддерживаемых едини-

цах времени.

 

-acl Может быть использован совместно с другими примитивами для поиска

файлов с расширенными ACL. Обратитесь к acl(3) для более подроб-

ной информации.

 

-amin n

Истинен, если разница между временем последнего доступа к файлу и

временем запуска find, округлённая до следующей полной минуты,

составляет n минут.

 

-anewer файл

То же, что и -neweram.

 

-atime n[smhdw]

Если единицы времени не указаны, то этот примитив истинен, если

разница между временем последнего доступа к файлу и временем

запуска find, округлённая до следующего полного 24-часового пери-

ода, составляет n 24-часовых периодов.

 

Если единицы времени указаны, то этот примитив истинен, если раз-

ница между временем последнего доступа к файлу и временем запуска

find в точности равна n единиц. Допустимые единицы времени:

 

s секунда

m минута (60 секунд)

h час (60 минут)

d день (24 часа)

w неделя (7 дней)

 

В одном аргументе -atime могут быть скомбинированы произвольные

единицы времени, например, ``-atime -1h30m''. Единицы времени

скорее всего будут полезны только в сочетании с модификатором +

или -.

 

-cmin n

Истинен, если разница между временем последнего изменения статус-

ной информации о файле и временем запуска find, округлённая до

следующей полной минуты, равна n минут.

 

-cnewer файл

То же, что и -newercm.

 

-ctime n[smhdw]

Если единицы времени не указаны, то этот примитив истинен, если

разница между временем последнего изменения статусной информации

о файле и и временем запуска find, округлённая до следующего пол-

ного 24-часового периода, составляет n 24-часовых периодов.

 

Если единицы времени указаны, то этот примитив истинен, если раз-

ница между временем последнего изменения статусной информации о

файле и временем запуска find в точности равна n единиц. Обрати-

тесь к описанию примитива -atime для информации о поддерживаемых

единицах времени.

 

-delete

Удалить найденные файлы и/или каталоги. Всегда истинен. Испол-

няется из текущего рабочего каталога, по мере рекурсивного про-

хода find вниз по дереву. Исходя из соображений безопасности,

find не будет пытаться удалять файлы с символом ``/'' в пути

относительно ``.''. Эта опция подразумевает обход сначала в глу-

бину.

 

-depth Всегда истинен; то же, что и опция -d.

 

-depth n

Истинен, если глубина файла относительно точки начала обхода

равна n.

 

-empty Истинен, если текущий файл или каталог пусты.

 

-exec имя_программы [аргумент ...] ;

Истинен, если программа с именем имя_программы возвращает нулевое

значение в качестве статуса завершения. Программе могут быть

переданы необязательные аргументы. Выражение должно завершаться

точкой с запятой (``;''). Если вы запускаете find из командной

оболочки (shell), вам может потребоваться экранировать точку с

запятой, поскольку в противном случае командная оболочка может

воспринять её как управляющий оператор. Если где-либо в имени

программы или в аргументах появляется строка ``{}'', то она заме-

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

лога, в котором был запущен find. Аргументы имя_программы и

аргумент не подвержены дальнейшему раскрытию шаблонов и конструк-

ций командной оболочки.

 

-exec имя_программы [аргумент ...] {} +

То же, что и -exec, за исключением того, что ``{}'' заменяется

максимально возможным количеством путей при каждом запуске ути-

литы. Это поведение аналогично таковому у xargs(1).

 

-execdir имя_программы [аргумент ...] ;

Примитив -execdir идентичен примитиву -exec за исключением того,

что программа с именем имя_программы будет запущена из каталога,

содержащего текущий файл. Имя файла, подставляемого вместо

строки ``{}'', не содержит пути к нему.

 

-flags [-|+]flags,notflags

Флаги задаются указанием символических имён (см. chflags(1)). О

флагах с префиксом "no" (за исключением "nodump") говорят, что

это notflags (отрицания флагов). Проверяется, что флаги в наборе

flags установлены, а флаги в наборе notflags сброшены. Заметьте,

что это отличается от примитива -perm, позволяющего пользователю

указать лишь те биты, которые установлены.

 

Если флагам предшествует минус (``-''), то этот примитив будет

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

биты из набора flags и не установлен ни один бит из набора

notflags. Если флагам предшествует плюс (``+''), то этот прими-

тив будет истинным, если среди флагов файла установлен любой из

битов набора flags, или не установлен любой из битов набора

notflags. В противном случае, этот примитив будет истинным, если

биты в наборе flags в точности соответствуют флагам файла, и ни

один из битов набора flags не указан в наборе notflags.

 

-fstype тип

Истинен, если файл содержится в файловой системе типа тип. Для

получения доступных в системе типов файловых систем можно вос-

пользоваться командой sysctl(8):

 

sysctl vfs

 

Кроме того, имеются два псевдо-типа, ``local'' и ``rdonly''.

Первый задаёт любую файловую систему, физически смонтированную на

машине, где запускается find, а второй обозначает любую файловую

систему, смонтированную только для чтения.

 

-group имя_группы

Истинен, если файл принадлежит группе с именем имя_группы. Если

аргумент имя_группы задан в числовом виде, и не существует такого

имени группы, то аргумент имя_группы трактуется как идентификатор

группы (group ID).

 

-iname шаблон

Подобен -name, но сравнение не учитывает регистр.

 

-inum номер

Истинен, если номер индексного дескриптора (inode) файла равен

номер.

 

-ipath шаблон

Подобен -path, но сравнение не учитывает регистр.

 

-iregex шаблон

Подобен -regex, но сравнение не учитывает регистр.

 

-links n

Истинен, если файл имеет n жёстких связей.

 

-ls Этот примитив всегда истинен. Для текущего файла в стандартный

вывод пишется следующая информация: номер индексного дескриптора

(inode), размер в 512-байтных блоках, права доступа к файлу,

число жёстких связей (hard links), владелец, группа, размер в

байтах, время последнего изменения и путь. Если файл представ-

ляет собой специальный файл блочного или символьного устройства,

вместо размера выводятся старший (major) и младший (minor) номера

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

знака ``->'' будет также выведен путь к указываемому файлу. Этот

формат идентичен используемому в ``ls -dgils''.

 

-maxdepth n

Всегда истинен; заставляет спускаться не более чем на n уровней

каталогов ниже аргументов командной строки. Если присутствует

примитив -maxdepth, он применяется ко всему выражению, даже если

в нормальных условиях он бы не вычислялся. ``-maxdepth 0'' огра-

ничивает весь поиск исключительно аргументами командной строки.

 

-mindepth n

Всегда истинен; не применять любые тесты или действия на уровнях

меньше n. Если присутствует примитив -mindepth, он применяется

ко всему выражению, даже если в нормальных условиях он бы не

вычислялся. ``-mindepth 1'' обрабатывает всё, кроме аргументов

командной строки.

 

-mmin n

Истинен, если разница между временем последнего изменения файла и

временем запуска find, округлённая до следующей полной минуты,

равна n минут.

 

-mnewer файл

То же, что и -newer.

 

-mtime n[smhdw]

Если единицы времени не указаны, то этот примитив истинен, если

разница между временем последнего изменения файла и временем

запуска find, округлённая до следующего полного 24-часового пери-

ода, составляет n 24-часовых периодов.

 

Если единицы времени указаны, то этот примитив истинен, если раз-

ница между временем последнего изменения файла и временем запуска

find в точности равна n единиц. Обратитесь к описанию примитива

-atime для информации о поддерживаемых единицах времени.

 

-name шаблон

Истинен, если последний компонент пути файла (его имя) подпадает

под шаблон. В шаблоне могут быть использованы специальные

шаблонные символы командной оболочки (``['', ``]'', ``*'', и

``?''). Эти символы могут быть заданы для проверки на совпадение

явным образом с помощью экранирования их символом обратной косой

черты (``\'').

 

-newer файл

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

изменения, чем файл.

 

-newerXY файл

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

доступа (X=a), время создания индексного дескриптора (inode),

т.е. самого файла (X=B), время последнего изменения индексного

дескриптора (X=c) или время последнего изменения файла (X=m),

нежели время последнего доступа (Y=a), время создания индексного

дескриптора (Y=B), время изменения индексного дескриптора (Y=c)

или время изменения (Y=m) файла файл. Кроме того, если Y=t, то

аргумент файл будет интерпретирован не как файл, а как непосред-

ственное указание даты в форме, понятной cvs(1). Можно заметить,

что использование -newermm эквивалентно использованию -newer.

 

-nogroup

Истинен, если файл принадлежит неизвестной группе.

 

-nouser

Истинен, если файл принадлежит неизвестному пользователю.

 

-ok имя_программы [аргумент ...] ;

Примитив -ok идентичен примитиву -exec, за исключением того, что

find запросит у пользователя подтверждение на выполнение про-

граммы с именем имя_программы выводом сообщения на терминал и

ожиданием ответа. Если ответ не был утвердительным (`y' в локали

(locale) ``POSIX''), команда не исполняется, и значение примитива

-ok будет ложным.

 

-okdir имя_программы [аргумент ...] ;

Примитив -okdir идентичен примитиву -execdir, с тем же исключе-

нием, что было описано для примитива -ok.

 

-path шаблон

Истинен, если рассматриваемый путь подпадает под шаблон. В

шаблоне можно использовать специальные шаблонные символы команд-

ной оболочки (``['', ``]'', ``*'', и ``?''). Эти символы могут

быть заданы для проверки на совпадение явным образом с помощью

экранирования их символом обратной косой черты (``\''). Прямая

косая черта (``/'') рассматривается как обычный символ и не тре-

бует явного указания для совпадения.

 

-perm [-|+]режим

Права доступа в аргументе режим могут быть заданы либо символиче-

ски (см. chmod(1)), либо восьмеричным числом. Если режим задан

символически, стартовым значением полагается ноль, и режим уста-

навливает или сбрасывает права без учёта маски создания файлов

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

07777 (S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO)

участвуют в сравнении с правами доступа файла. Если перед аргу-

ментом режим указан минус (``-''), то этот примитив будет истин-

ным, если по крайней мере все биты в аргументе режим установлены

в правах доступа файла. Если перед аргументом режим указан плюс

(``+''), то этот примитив будет истинным, если любой из битов в

аргументе режим установлен в правах доступа файла. В противном

случае, этот примитив будет истинным только при точном совпадении

битов в аргументе режим с правами доступа текущего файла. Обра-

тите внимание, что минус (``-'') не может быть первым символом

при символическом задании прав.

 

-print Этот примитив всегда истинен. Он выводит путь текущего файла в

стандартный вывод. Если не указан ни один из примитивов -exec,

-ls, -print0 или -ok, то заданное выражение фактически будет

заменено на ( заданное выражение ) -print.

 

-print0

Этот примитив всегда истинен. Он выводит путь текущего файла в

стандартный вывод, и следом за ним символ ASCII NUL (символ с

кодом 0).

 

-prune Этот примитив всегда истинен. Он заставляет find не спускаться в

текущий файл. Необходимо отметить, что примитив -prune не дей-

ствует при указании опции -d.

 

-regex шаблон

Истинен, если полный путь файла подпадает под регулярное выраже-

ние шаблон. Для задания файла, именуемого ``./foo/xyzzy'', можно

использовать регулярные выражения ``.*/[xyz]*'' или

``.*/foo/.*'', но не ``xyzzy'' и не ``/foo/''.

 

-size n[ckMGTP]

Истинен, если размер файла в 512-байтных блоках, при округлении

вверх, равен n. Если за n следует c, то примитив будет истинным,

если размер файла равен n байт (символов). Аналогично, если за n

следует буква множителя, тогда размер файла сравнивается с n,

помноженным на одно из следующих:

 

k килобайт (1024 байта)

M мегабайт (1024 килобайта)

G гигабайт (1024 мегабайта)

T терабайт (1024 гигабайта)

P петабайт (1024 терабайта)

 

-type тип

Истинен, если типом текущего файла является тип. Возможные типы

файлов:

 

b блочный специальный

c символьный специальный

d каталог

f обычный файл

l символическая ссылка

p именованный канал (FIFO)

s сокет

 

-user имя_пользователя

Истинен, если файл принадлежит пользователю с именем

имя_пользователя. Если имя_пользователя задано в числовом виде и

такого имени пользователя не существует, то аргумент

имя_пользователя трактуется как идентификатор пользователя (user

ID).

 

Все примитивы, принимающие числовой аргумент, допускают задание этого

числа со знаком плюс (``+'') или минус (``-''). Предшествующий плюс

означает ``больше n'', предшествующий минус означает ``меньше n'', а

отсутствие знака -- ``ровно n''.

 

ОПЕРАТОРЫ

Примитивы могут комбинироваться с использованием нижеследующих операто-

ров. Операторы перечислены в порядке понижения приоритета.

 

( выражение )

Будет истинным, если истинно выражение в скобках.

 

! выражение

-false выражение

-not выражение

Это унарный оператор НЕ. Он будет истинным, если выражение

ложно.

 

выражение -and выражение

выражение выражение

Оператор -and есть логический оператор И. Поскольку он подразу-

мевается непосредственным соседством двух выражений, его не тре-

буется указывать явно. Выражение истинно, если оба выражения

истинны. Второе выражение не вычисляется, если первое выражение

ложно.

 

выражение -or выражение

Оператор -or есть логический оператор ИЛИ. Выражение истинно,

если любое из двух выражений истинно. Второе выражение не вычис-

ляется, если первое выражение истинно.

 

Все операнды и примитивы должны быть отдельными аргументами find. Прими-

тивы, имеющие собственные аргументы, ожидают их как отдельные аргументы

find.

 

ОКРУЖЕНИЕ

Переменные окружения LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES и

LC_TIME влияют на выполнение утилиты find, как описано в environ(7).

 

ПРИМЕРЫ

Нижеследующие примеры показаны в виде, принимаемом командной оболочкой:

 

find / \! -name "*.c" -print

Вывести список всех файлов, имена которых не заканчиваются на .c.

 

find / -newer ttt -user wnj -print

Вывести список всех файлов, принадлежащих пользователю ``wnj'',

которые изменены позднее файла ttt.

 

find / \! \( -newer ttt -user wnj \) -print

Вывести список всех файлов, которые изменены не позднее файла ttt

и одновременно не принадлежат пользователю ``wnj''.

 

find / \( -newer ttt -or -user wnj \) -print

Вывести список всех файлов, которые принадлежат пользователю

``wnj'' или изменены позднее файла ttt.

 

find / -newerct '1 minute ago' -print

Вывести список всех файлов, индексный дескриптор которых был

изменён не позднее одной минуты назад.

 

find / -type f -exec echo {} \;

Использовать команду echo(1) для вывода списка всех файлов.

 

find -L /usr/ports/packages -type l -delete

Удалить все битые символические ссылки в /usr/ports/packages.

 

find /usr/src -name CVS -prune -o -depth +6 -print

Найти файлы и каталоги, имеющие по крайней мере семь уровней вло-

женности в рабочем каталоге /usr/src.

 

find /usr/src -name CVS -prune -o -mindepth 7 -print

Это не эквивалентно предыдущему примеру, поскольку -prune не

выполняется ниже уровня семь.

 

СОВМЕСТИМОСТЬ

Примитив -follow устарел; вместо него рекомендуется использовать опцию

-L. Подробнее об этом смотрите ниже, в разделе СТАНДАРТЫ.

 

СМОТРИ ТАКЖЕ

chflags(1), chmod(1), cvs(1), locate(1), whereis(1), which(1), xargs(1),

stat(2), acl(3), fts(3), getgrent(3), getpwent(3), strmode(3),

re_format(7), symlink(7)

 

СТАНДАРТЫ

Синтаксис утилиты find представляет собой надмножество синтаксиса, опи-

санного в стандарте IEEE Std 1003.1-2001 (``POSIX.1'').

 

Все однобуквенные опции, кроме -H и -L, а также -amin, -anewer, -cmin,

-cnewer, -delete, -empty, -fstype, -iname, -inum, -iregex, -ls,

-maxdepth, -mindepth, -mmin, -path, -print0, -regex и все связанные с

временем создания примитивы -B*, представляют собой расширения к стан-

дарту IEEE Std 1003.1-2001 (``POSIX.1'').

 

Исторически, опции -d, -L и -x были реализованы через примитивы -depth,

-follow и -xdev. Эти примитивы были всегда истинны. Поскольку они фак-

тически были глобальными переменными, вступающими в силу до начала

обхода, некоторые допустимые выражения могли иметь неожиданные резуль-

таты, например, -print -o -depth. Поскольку -print всегда истинен, стан-

дартный порядок вычислений подразумевает, что -depth никогда не выпол-

нится, что в действительности не так.

 

Оператор -or был реализован как -o, а оператор -and был реализован как

-a.

 

Исторические реализации примитивов -exec и -ok не заменяли строку ``{}''

в имени утилиты и её аргументах, если сразу перед этой строкой или сразу

после неё были непробельные символы. Эта версия заменяет её в любом

месте в имени утилиты и её аргументах, где бы она ни встретилась.

 

Опция -E была навеяна одноимённой опцией grep(1) и sed(1).

 

ИСТОРИЯ

Команда find появилась в Version 1 AT&T UNIX.

 

ПРОБЛЕМЫ

Специальные символы, используемые find, являются также специальными сим-

волами для многих командных оболочек. В частности, может потребоваться

экранировать от командной оболочки символы ``*'', ``['', ``]'', ``?'',

``('', ``)'', ``!'', ``\'' и ``;''.

 

Поскольку не существует разделителей, отделяющих опции от имён файлов или

имена файлов от выражений, трудно задать файлы с именами типа -xdev или

!. Эти проблемы решаются опцией -f и конструкцией ``--'' для getopt(3).

 

Примитив -delete плохо взаимодействует с другими опциями, меняющими поря-

док обхода дерева файловой системы.

 

Примитивы -mindepth и -maxdepth фактически являются глобальными опциями

(как документировано выше). Они, по-видимому, должны быть заменены опци-

ями, выглядящими как опции.