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

Версия для печатиОтправить другуPDF version
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 фактически являются глобальными опциями
     (как документировано выше).  Они, по-видимому, должны быть заменены опци-
     ями, выглядящими как опции.

FreeBSD 6.2                     13 декабря 2006                    FreeBSD 6.2
Ваша оценка: Нет Средняя: 5 (3 голоса)

Вставай, Україно!

Литература