НАИМЕНОВАНИЕ
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.
- -P
- Никогда не
переходить
по
символическим
ссылкам.
Это
поведение
по
умолчанию.
Когда find
проверяет
или
выводит
информацию
о файлах, а
файл
является
символической
ссылкой,
используемая
информация
должна
быть взята
из свойств
самой
символической
ссылки.
- -L
- Переходить
по
символическим
ссылкам.
Когда find
проверяет
или
выводит
информацию
о файлах,
используемая
информация
должна
быть взята
из свойств
файла, на
который
указывает
ссылка, а
не из самой
ссылки
(если
только это
не
поврежденная
символическая
ссылка или
если find не
может
проверить
файл, на
который
указывает
ссылка).
Использование
этого
параметра
подразумевает
параметр
-noleaf. Если вы
позже
воспользуетесь
параметром
-P, то
параметр
-noleaf
по-прежнему
будет
действовать.
Если -L
действует
и find
обнаруживает
символическую
ссылку на
подкаталог
во время
поиска,
будет
выполнен
поиск в
подкаталоге,
на который
указывает
символическая
ссылка.
- Когда
действует
параметр
-L,
предикат
-type всегда
будет
соответствовать
типу файла,
на который
указывает
символическая
ссылка, а
не самой
ссылке
(если
только
символическая
ссылка не
повреждена).
Действия,
которые
могут
привести к
разрыву
символических
ссылок во
время
выполнения
find
(например,
-delete), могут
привести к
сбивающему
с толку
поведению.
Использование
-L приводит
к тому, что
предикаты
-lname и -il name
всегда
возвращают
значение false.
- -H
- Не
переходить
по
символическими
ссылкам, за
исключением
случаев
обработки
аргументов
командной
строки.
Когда 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, -exec dir, -ok и -okdir.
- opt
- Выводить
диагностическую
информацию,
относящуюся
к
оптимизации
дерева
выражений;
смотрите
параметр -O.
- rates
- Выводить
сводную
информацию,
указывающую,
как часто
каждый
предикат
выполнялся
успешно
или с
ошибкой.
- search
- Подробная
навигация
по дереву
каталогов.
- stat
- Выводить
сообщения
по мере
проверки
файлов с
помощью
системных
вызовов stat
и lstat.
Программа
find
старается
свести к
минимуму
количество
таких
вызовов.
- tree
- Показать
дерево
выражений
в его
первоначальном
и
оптимизированном
видах.
- all
- Включить
все
остальные
параметры
отладки
(кроме help).
- help
- Вывести
сведения о
параметрах
отладки.
- -Olevel
- Включить
оптимизацию
запросов.
Утилита find
переупорядочивает
тесты,
чтобы
ускорить
выполнение
(при
сохранении
общего
эффекта);
то есть
предикаты
с
побочными
эффектами
не
переупорядочиваются
относительно
друг друга.
На каждом
уровне
оптимизации
выполняется
следующая
оптимизация.
- 0
- Эквивалентно
уровню
оптимизации
1.
- 1
- Это
уровень
оптимизации
по
умолчанию,
который
соответствует
традиционному
поведению.
Выражения
переупорядочены
таким
образом,
чтобы
сначала
выполнить
тесты,
основанные
только на
именах
файлов
(например,
-name и -regex).
- 2
- Любые
тесты -type
или -xtype
выполняются
после
любых
тестов,
основанных
только на
именах
файлов, но
перед
любыми
тестами,
требующими
получения
информации
из
индексного
дескриптора.
Во многих
современных
версиях Unix
типы
файлов
возвращаются
с помощью
функции readdir()
и поэтому
эти
предикаты
вычисляются
быстрее,
чем
предикаты,
которые
сначала
должны
определить
файл. Если
вы
используете
предикат
-fstype FOO и
указываете
тип
файловой
системы FOO,
который
неизвестен
(то есть
присутствует
в `/etc/mtab') на
момент
запуска find,
то этот
предикат
эквивалентен
-false.
- 3
- На этом
уровне
оптимизации
включен
полный
оптимизатор
запросов,
основанный
на
затратах.
Порядок
выполнения
тестов
изменен
таким
образом,
что
сначала
выполняются
"дешевые"
(т.е.
быстрые)
тесты, а
более
"дорогие",
при
необходимости,
выполняются
позже. В
пределах
каждого
диапазона
затрат
предикаты
оцениваются
раньше или
позже в
зависимости
от того,
будут ли
они
успешными
или нет.
Для -o
предикаты,
которые,
скорее
всего,
будут
успешными,
оцениваются
раньше, а
для -a
предикаты,
которые,
скорее
всего, не
будут
успешными,
оцениваются
раньше.
- Оптимизатор,
ориентированный
на затраты,
имеет
четкое
представление
о том,
насколько
вероятно
успешное
проведение
того или
иного
теста. В
некоторых
случаях
вероятность
учитывает
специфику
теста
(например,
предполагается,
что у -type f
больше
шансов на
успех, чем
у -type c). В
настоящее
время
проводится
оценка
оптимизатора,
основанного
на
затратах.
Если это на
самом деле
не улучшит
производительность
find, то он
будет
снова
удален. И
наоборот,
оптимизации,
которые
оказались
надежными
и
действенными,
со
временем
могут быть
включены
на более
низких
уровнях
оптимизации.
Однако
поведение
по
умолчанию
(т.е.
уровень
оптимизации
1) не будет
изменено в
серии
выпусков 4.3.x.
Набор
тестов
утилиты find
запускает
все тесты
find на
каждом
уровне
оптимизации
и
гарантирует,
что
результат
будет
одинаковым.
Изменение
порядка
операций,
выполняемых
оптимизатором
на основе
затрат,
может
привести
к
заметным
для
пользователя
изменениям
в
поведении.
Например,
предикаты
-readable и -empty
чувствительны
к
изменению
порядка.
Если они
запускаются
в порядке
-empty -readable, то для
не
читаемых
каталогов
будет
выдано
сообщение
об ошибке.
Если же
они
запускаются
в порядке
-readable -empty, то
сообщение
об ошибке
не будет
выдано.
Именно по
этой
причине
переупорядочение
такой
операции
не
выполняется
на уровне
оптимизации
по
умолчанию.
ВЫРАЖЕНИЕ
Выражением
(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).
Они влияют
только на
тесты,
выполняемые
далее в
командной
строке.
- -daystart
- Измерять
время (для
значений
-amin, -atime, -cmin, -time, -mmin
и -mtime) с
начала
сегодняшних
суток, а не
с 24 часов
назад. Этот
параметр
влияет
только на
тесты,
которые
появляются
позже в
командной
строке.
- -follow
- Не
рекомендуется
(вместо
этого
используйте
параметр
-L).
Разыменовывать
символические
ссылки.
Подразумевает
параметр
-noleaf.
Параметр
-follow влияет
только на
те тесты,
которые
следуют
после него
в
командной
строке.
Если не
указан
параметр -H
или -L,
расположение
параметра
-follow
изменяет
поведение
предиката
(в смысле
математической
логики) -newer;
любые
файлы,
указанные
в качестве
аргумента
параметра
-newer, будут
разыменованы,
если они
являются
символическими
ссылками.
То же самое
относится
и к -newerXY, -anewer и -cnewer.
Аналогично,
предикат
-type всегда
будет
соответствовать
типу файла,
на который
указывает
символическая
ссылка, а
не самой
ссылке.
Использование
-follow
приводит к
тому, что
предикаты
-lname и -ilname
всегда
возвращают
значение
"ложно" (false).
- -regextype
type
- Изменяет
синтаксис
регулярных
выражений,
распознаваемых
с помощью
тестов -regex и
-iregex, которые
выполняются
позже в
командной
строке.
Чтобы
узнать,
какие типы
регулярных
выражений
известны,
используйте
-regextype help. В
документации
Texinfo
(обратитесь
к разделу
СМОТРИТЕ
ТАКЖЕ)
объясняется
значение и
различия
между
различными
типами
регулярных
выражений.
Если вы не
используете
этот
параметр,
утилита find
ведет себя
так, как
если бы был
указан тип
регулярного
выражения
emacs.
- -warn, -nowarn
- Включить
(-warn)или
отключить
(-nowarn )
сообщения.
Эти
предупреждения
относятся
только к
использованию
командной
строки, а
не к
каким-либо
условиям, с
которыми
может
столкнуться
find при
поиске в
каталогах.
Поведение
по
умолчанию
соответствует
-warn, если
стандартным
вводом
является tty
и -nowarn в
противном
случае.
Если
выдается
предупреждающее
сообщение,
относящееся
к
использованию
командной
строки, это
не влияет
на статус
выхода find.
Если
задана
переменная
окружения
POSIXLY_CORRECT и также
используется
-warn, то не
определено,
какие
предупреждения
будут
активны,
если
таковые
имеются.
ОБЩИЕ
ПАРАМЕТРЫ
Общие
параметры
всегда
возвращают
значение
"истинно" (true).
Общие
параметры
вступают в
силу даже
для тестов,
которые
выполнялись
ранее в
командной
строке.
Чтобы
избежать
путаницы,
общие
параметры
следует
указывать
в
командной
строке
после
списка
начальных
точек,
непосредственно
перед
первым
тестом,
позиционным
параметром
или
действием.
Если вы
укажете
общий
параметр в
каком-либо
другом
месте, то
утилита find
выдаст
предупреждающее
сообщение,
объясняющее,
что это
может
привести к
путанице.
Общие
параметры
располагаются
после
списка
начальных
точек и
поэтому не
являются
такими же
параметрами,
как,
например,
-L.
- -d
- Синоним -depth,
для
обеспечения
совместимости
с FreeBSD, NetBSD, macOS X и OpenBSD.
- -depth
- Обрабатывать
содержимое
каждой
директории
перед
самой
директорией.
Действие -delete
также
подразумевает
-depth.
- -files0-from
file
- Прочитать
начальные
точки из 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.
- -help, --help
- Вывести
краткое
описание
по
использованию
find в
командной
строке и
завершить
работу.
- -ignore_readdir_race
- Обычно find
выдает
сообщение
об ошибке,
когда ей не
удается
найти файл.
Если вы
зададите
этот
параметр и
файл будет
удален в
промежутке
между
моментом,
когда find
считывает
имя файла
из
каталога и
моментом,
когда она
пытается
сохранить
файл, то
сообщение
об ошибке
выдано не
будет. Это
также
относится
к файлам
или
каталогам,
имена
которых
указаны в
командной
строке.
Этот
параметр
вступает в
силу во
время
чтения
командной
строки: это
означает,
что вы не
можете
выполнять
поиск в
одной
части
файловой
системы с
включенным
этим
параметром,
а в другой -
с
выключенным
параметром
(если вам
нужно это
сделать, то
вам
следует
выполнить
вместо
этого две
команды find:
одну с этим
параметром,
а другую
без него).
Кроме
того, find с
параметром
-ignore_readdir_race
проигнорирует
ошибки
действия
-delete в
случае,
если файл
исчез с
момента
чтения
родительского
каталога:
она не
выдаст
диагностику
ошибки, а
код
возвращения
действия
-delete будет
"истинно"
(true).
- -maxdepth
levels
- Спуститься
не более
чем на levels
уровней
каталогов
ниже
начальных
точек (это
должно
быть
неотрицательное
целое
число).
Использование
-maxdepth 0
означает
применение
тестов и
действий
только к
самим
начальным
точкам.
- -mindepth
levels
- Не
выполнять
никаких
тестов или
действий
на уровнях
ниже levels
(неотрицательное
целое
число).
Использование
-mindepth 1
означает
обработку
всех
файлов,
кроме
начальных
точек.
- -mount
- Не
просматривать
каталоги в
других
файловых
системах.
Альтернативное
наименование
для -x dev, для
совместимости
с
некоторыми
другими
версиями
find.
- -noignore_readdir_race
- Отключить
параметр
-ignore_readdir_race.
- -noleaf
- Не
проводить
оптимизацию,
предполагая,
что в
каталогах
содержится
на 2
подкаталога
меньше, чем
количество
жестких
ссылок на
них. Этот
параметр
необходим
при поиске
в файловых
системах,
которые не
соответствуют
соглашению
о ссылках в
каталогах
Unix, например,
в файловых
системах CD-ROM
или MS-DOS, или в
точках
монтирования
томов AFS.
Каждый
каталог в
обычной
файловой
системе Unix
имеет как
минимум 2
жесткие
ссылки: на
его имя и
на запись
".". Кроме
того,
каждый из
его
подкаталогов
(если
таковой
имеется)
имеет
запись "..",
связанную
с этим
каталогом.
Когда find
проверяет
каталог,
после того,
как она
обнаружила
на 2
подкаталога
меньше, чем
количество
ссылок в
каталоге,
она знает,
что
остальные
записи в
каталоге
не
являются
каталогами
(это
-"конечные"
файлы в
дереве
каталогов).
Если нужно
проверить
только
имена
файлов, то
нет
необходимости
их
статистизировать,
а это
значительно
увеличивает
скорость
поиска.
- -version,
--version
- Вывести
номер
версии find и
завершить
работу.
- -xdev
- Не удалять
каталоги
из других
файловых
систем.
ТЕСТЫ
Некоторые
тесты,
например
-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.
Поддерживаются
следующие
тесты:
- -amin n
- Последний
раз к файлу
обращались
менее,
более или
ровно n
минут
назад.
- -anewer
reference
- Время
последнего
обращения
к текущему
файлу
является
более
поздним,
чем время
последнего
изменения
данных в
файле reference.
Если reference
является
символической
ссылкой и
используется
параметр -H
или
параметр
-L, то
всегда
используется
время
последнего
изменения
данных
файла, на
который
указывает
эта ссылка.
- -atime n
- Последний
раз к файлу
обращались
менее,
более или
ровно 24
часа назад.
Когда find
вычисляет,
сколько
24-часовых
периодов
до этого к
файлу был
осуществлен
последний
доступ, то
любая
дробная
часть
игнорируется,
поэтому,
чтобы
соответствовать
-atime +1, доступ
к файлу
должен был
быть
осуществлен
по крайней
мере two
(двое)
суток
назад.
- -cmin n
- Статус
файла в
последний
раз
менялся
менее,
более или
ровно n
минут
назад.
- -cnewer
reference
- Время
последнего
изменения
статуса
текущего
файла
является
более
поздним,
чем время
последнего
изменения
данных в
файле reference.
Если reference
является
символической
ссылкой и
используется
параметр -H
или
параметр
-L, то
всегда
используется
время
последнего
изменения
данных в
файле, на
который
указывает
ссылка.
- -ctime n
- Статус
файла в
последний
раз
менялся
менее,
более или
ровно 24
часа назад.
Смотрите
комментарии
к -atime, чтобы
понять, как
округление
влияет на
интерпретацию
времени
изменения
статуса
файла.
- -empty
- Файл пуст и
представляет
собой либо
обычный
файл, либо
каталог.
- -executable
- Сопоставлять,
доступные
для поиска
текущему
пользователю,
исполняемые
файлы и
каталоги (в
смысле
разрешения
имен
файлов).
При этом
учитываются
списки
контроля
доступа и
другие
артефакты
разрешений,
которые
тест -perm
игнорирует.
Этот тест
использует
системный
вызов access(2) и
поэтому
может
выдать
неправильный
результат
в случае
использования
серверов NFS,
на которых
выполняется
сопоставление
UID (или, на
которых
разрешен
доступ
только
пользователю
root). Дело в том,
что многие
клиентские
системы
применяют
системный
вызов access(2) из
своего
клиентского
ядра и
поэтому не
могут
использовать
для
сопоставления
информацию
UID,
хранящуюся
на сервере.
Однако,
поскольку
этот тест
основан
только на
результате
системного
вызова access(2),
то нет
никакой
уверенности
в том, что
файл, для
которого
этот тест
завершился
успешно,
действительно
является
таковым.
- -false
- Всегда
ложно.
- -fstype
type
- Файл
находится
в файловой
системе
типа type.
Допустимые
типы
файловых
систем
различаются
в разных
версиях Unix;
неполный
список
типов
файловых
систем,
которые
могут быть
в той или
иной
версии Unix,
следующий:
ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. Вы
можете
использовать
-printf с
директивой
%F, чтобы
просмотреть
типы ваших
файловых
систем.
- -gid n
- Числовой
идентификатор
группы
файла
менее,
более или
точно
равен n.
- -group gname
- Файл
принадлежит
группе,
именуемой
gname (можно
также
использовать
цифровой
идентификатор
группы).
- -ilname
pattern
- Аналогично
-lname, но
соответствие
не зависит
от
регистра.
Если
используется
параметр -L
или
параметр
-follow, то этот
тест
возвращает
значение false,
если
только не
нарушена
символическая
ссылка.
- -iname
pattern
- Аналогично
-name, но
соответствие
не зависит
от
регистра.
Например,
шаблонам
"fo*" и "F??"
соответствуют
файлы с
именами "Foo",
"FOO", "foo", "fOo", "fOo"
и т.д.
Шаблону "*foo*"
также
будет
соответствовать
файл с
именем ".foobar".
- -inum n
- Индексный
дескриптор
файла
менее, чем
n, более,
чем n или
равен n.
Обычно
проще
использовать
тест -samefile.
- -ipath
pattern
- Аналогично
-path, но при
проверке
соответствия
регистр не
учитывается.
- -iregex
pattern
- Аналогично
-regex, но при
проверке
соответствия
регистр не
учитывается.
- -iwholename
pattern
- Смотрите -ipath.
Этот
вариант
менее
переносим,
чем -ipath.
- -links n
- Файл
содержит
менее,
более или
ровно n
жестких
ссылок.
- -lname
pattern
- Файл
представляет
собой
символическую
ссылку,
содержимое
которой
соответствует
шаблону
оболочки
pattern.
Метасимволы
не
содержат
специальных
символов
"/" или ".".
Если
указан
параметр -L
или
параметр
-follow, то этот
тест
возвращает
значение false,
если
символическая
ссылка не
нарушена.
- -mmin n
- Данные
файла были
в
последний
раз
изменены
менее,
более или
ровно n
минут
назад.
- -mtime n
- Данные
файла в
последний
раз
изменялись
менее,
более или
ровно 24
часа назад.
Смотрите
комментарии
к -atime, чтобы
узнать, как
округление
влияет на
интерпретацию
времени
изменения
файла.
- -name pattern
- Основное
имя файла
(т.е. путь с
удаленными
предшествующими
каталогами)
соответствует
шаблону
оболочки
pattern.
Поскольку
предшествующие
каталоги в
именах
файлов
удалены, то
pattern не
должен
содержать
косой
черты,
потому что
"-name a/b"
никогда
ничему не
будет
соответствовать
(скорее
всего вам
лучше
вместо
этого
использовать
-path).
Исключением
из этого
правила
является
использование
только
косой
черты в
качестве
pattern ("-name /"),
поскольку
это
допустимая
строка для
сопоставления
с корневым
каталогом
"/"
(поскольку
основным
именем "/"
является
"/"). При
попытке
передать
шаблон,
содержащий
символ "-",
но не
состоящий
исключительно
из одной
косой
черты,
выдается
предупреждение,
если
только не
задана
переменная
окружения
POSIXLY_CORRECT или не
используется
параметр
-nowarn.
Для того,
чтобы
игнорировать
каталог и
файлы,
находящиеся
в нем,
используйте
-prune вместо
проверки
каждого
файла в
дереве
каталогов
(смотрите
пример в
описании
этого
действия).
Фигурные
скобки не
распознаются
как что-то
особенное,
несмотря
на то, что
некоторые
оболочки,
включая Bash,
придают
фигурным
скобкам
особое
значение
в
шаблонах
оболочек.
Сопоставление
имен
файлов
выполняется
с помощью
библиотечной
функции
fnmatch(3). Не
забудьте
заключить
шаблон в
кавычки,
чтобы
защитить
его от
расширения
оболочкой.
- -newer
reference
- Время
последнего
изменения
данных
текущего
файла
является
более
поздним,
чем время
последнего
изменения
данных
файла reference.
Если reference
является
символической
ссылкой и
используется
параметр -H
или
параметр
-L, то
всегда
используется
время
последнего
изменения
данных
файла, на
который
указывает
символическая
ссылка.
- -newerXY
reference
- Выполняется
успешно,
если
временная
метка X
рассматриваемого
файла
более
новая, чем
временная
метка Y
файла reference.
Буквы X и Y
могут быть
любыми из
следующего
набора:
| a |
Время
доступа к
файлу reference. |
| B |
Время
создания
файла reference. |
| c |
Время
изменения
статуса
индексного
дескриптора
reference. |
| m |
Время
изменения
файла reference. |
| t |
reference
интерпретируется
непосредственно
как
время. |
Некоторые
комбинации
недопустимы;
например,
недопустимо,
чтобы X
было t.
Некоторые
комбинации
реализованы
не во всех
системах;
например,
B
поддерживается
не во всех
системах.
Если
указана
недопустимая
или не
поддерживаемая
комбинация
XY, то
возникает
фатальная
ошибка.
Спецификации
времени
интерпретируются
как
аргументы
для
параметра
-d в GNU date. Если
вы
попытаетесь
использовать
время
создания,
указанное
в
файле-ссылке
и время
создания
не будет
определено,
то
появится
сообщение
о
фатальной
ошибке.
Если вы
укажете
тест,
который
относится
ко
времени
создания
проверяемых
файлов, то
этот тест
не будет
выполнен
для любых
файлов,
время
создания
которых
неизвестно.
- -nogroup
- Ни одна
группа не
соответствует
числовому
идентификатору
группы
файла.
- -nouser
- Ни один
пользователь
не
соответствует
числовому
идентификатору
пользователя
файла.
- -path pattern
- Имя файла
соответствует
шаблону
оболочки
pattern.
Метасимволы
не
содержат
символов
"/" или "."
специально;
так,
например,
find . -path "./sr*sc"
выведет
запись для
каталога с
именем ./src/misc
(если
таковой
существует).
Чтобы
игнорировать
всё дерево
каталогов,
используйте
-prune вместо
проверки
каждого
файла в
дереве
каталогов.
Обратите
внимание,
что
проверка
соответствия
шаблону
применяется
ко всему
имени
файла,
начиная с
одной из
начальных
точек,
указанных
в
командной
строке.
Здесь
имеет
смысл
использовать
абсолютное
имя пути
только в
том случае,
если
соответствующая
начальная
точка
также
является
абсолютным
путем. Это
означает,
что
нижеприведённой
команде
никогда
ничто не
будет
соответствовать:
find bar -path /foo/bar/myfile -print
Утилита find
сравнивает
аргумент
-path с
объединением
имени
каталога и
основного
имени
проверяемого
файла.
Поскольку
конкатенация
никогда не
заканчивается
косой
чертой, то
аргументы
-path,
заканчивающиеся
косой
чертой,
ничему не
будут
соответствовать
(за
исключением,
возможно,
начальной
точки,
указанной
в
командной
строке).
Предикат
-path также
поддерживается
find HP-UX и
является
частью
стандарта
POSIX 2008.
- -perm mode
- Биты прав
доступа
для файла в
точности
соответствуют
mode (в
восьмеричной
системе
счисления
или в
символьной
записи).
Поскольку
требуется
точное
соответствие,
то если вы
хотите
использовать
эту форму
для
символьной
записи,
вам,
возможно,
придется
указать
довольно
сложную
строку.
Например,
строка "-perm g=w"
будет
соответствовать
только
файлам,
имеющим
права
доступа 0020
(то есть
тем, для
которых
право
доступа на
групповую
запись
является
единственным
установленным
правом
доступа).
Скорее
всего вам
лучше
использовать
формы "/"
или "-",
например,
"-perm -g=w",
которые
соответствуют
любому
файлу с
правом
доступа на
запись
группы.
Некоторые
наглядные
примеры
приведены
в разделе
ПРИМЕРЫ.
- -perm
-mode
- Для файла
заданы все
биты прав
доступа в
mode. В этой
форме
принимаются
символьные
записи и
обычно
используется
именно эта
форма. Вы
должны
указать "u",
"g" или "o",
если вы
используете
символьную
запись.
Некоторые
наглядные
примеры
приведены
в разделе
ПРИМЕРЫ.
- -perm
/mode
- Для файла
заданы
любые
права
доступа mode.
В этой
форме
допускаются
символьные
записи. Вы
должны
указать "u",
"g" или "o",
если вы
используете
символьные
записи.
Некоторые
наглядные
примеры
приведены
в разделе
ПРИМЕРЫ.
Если в mode не
заданы
биты прав
доступа, то
этот тест
соответствует
любому
файлу (смыл
здесь
заключается
в том,
чтобы
соответствовать
поведению
-perm -000).
- -perm
+mode
- Это больше
не
поддерживается
(и
считается
устаревшим
с 2005 года).
Вместо
этого
используйте
-perm /mode.
- -readable
- Сопоставлять
файлы,
доступные
для чтения
текущему
пользователю.
При этом
учитываются
списки
прав
доступа и
другие
артефакты
разрешений,
которые
тест -perm
игнорирует.
Этот тест
использует
системный
вызов access(2) и
поэтому
может
выдать
неправильный
результат
в случае
использования
серверов NFS,
на которых
выполняется
сопоставление
UID (или, на
которых
разрешен
доступ
только
пользователю
root). Дело в том,
что многие
клиентские
системы
применяют
системный
вызов access(2) из
своего
клиентского
ядра и
поэтому не
могут
использовать
для
сопоставления
информацию
UID,
хранящуюся
на сервере.
Однако,
поскольку
этот тест
основан
только на
результате
системного
вызова access(2),
то нет
никакой
уверенности
в том, что
файл, для
которого
этот тест
завершился
успешно,
действительно
является
таковым.
- -regex
pattern
- Имя файла
соответствует
регулярному
выражению
шаблона pattern.
Это
соответствие
полного
пути, а не
поиск.
Например,
для
соответствия
файлу с
именем ./fubar 3
можно
использовать
регулярное
выражение
`.*bar.' или `.*b.*3', но
не `f.*r3'.
Регулярные
выражения,
распознаваемые
с помощью
find, по
умолчанию
являются
регулярными
выражениями
Emacs, но это
можно
изменить с
помощью
параметра
-regextype.
- -samefile
name
- Файл
ссылается
на тот же
индексный
дескриптор,
что и файл
name. Когда
используется
-L, это
может
содержать
символические
ссылки.
- -size
n[cwbkMG]
- Файл
занимает
меньше,
больше или
ровно 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
байт.
- -true
- Всегда
истинно.
- -type c
- Файл имеет
тип c:
- b
- специальный
блок
(буферизованный);
- c
- специальный
символ (не
буферизованный);
- d
- каталог;
- p
- именованный
канал (FIFO);
- ф
- обычный
файл
- l
- символическая
ссылка; это
никогда не
выполняется,
если
действует
параметр -L
или -follow, если
только
символическая
ссылка не
нарушена.
Если вы
хотите
выполнить
поиск
символических
ссылок,
когда
действует
-L, то
используйте
-xtype;
- s
- socket
- D
- вход (Solaris).
- Для поиска
более чем
одного
типа
одновременно
вы можете
ввести
сводный
список
букв типа,
разделенных
запятой ","
(расширение
GNU).
- -uid n
- Числовой
идентификатор
пользователя
файла
менее,
более или
точно
равен n.
- -used n
- Последний
раз к файлу
обращались
менее,
более или
ровно n
дней после
последнего
изменения
его
статуса.
- -user uname
- Файл
принадлежит
пользователю
uname
(допускается
использование
числового
идентификатора
пользователя).
- -wholename
pattern
- Смотрите -path.
Эта
альтернатива
менее
переносима,
чем -path.
- -writable
- Сопоставлять
файлы,
доступные
для записи
текущему
пользователю.
При этом
учитываются
списки
прав
доступа и
другие
артефакты
прав
доступа,
которые
тест -perm
игнорирует.
Этот тест
использует
системный
вызов access(2) и
поэтому
может
выдать
неправильный
результат
в случае
использования
серверов NFS,
на которых
выполняется
сопоставление
UID (или, на
которых
разрешен
доступ
только
пользователю
root). Дело в том,
что многие
клиентские
системы
применяют
системный
вызов access(2) из
своего
клиентского
ядра и
поэтому не
могут
использовать
для
сопоставления
информацию
UID,
хранящуюся
на сервере.
Однако,
поскольку
этот тест
основан
только на
результате
системного
вызова access(2),
то нет
никакой
уверенности
в том, что
файл, для
которого
этот тест
завершился
успешно,
действительно
является
таковым.
- -xtype c
- То же, что и
-type, если
только
файл не
является
символической
ссылкой.
Для
символических
ссылок:
если был
указан
параметр -H
или -P, то
значение true,
если файл
является
ссылкой на
файл типа
c; если был
указан
параметр
-L, то
значение true,
если c
равно "l".
Другими
словами,
для
символических
ссылок -xtype
проверяет
тип файла,
который -type
не
проверяет.
Если
символическая
ссылка
нарушена
(потому что
объект, на
который
она
указывает,
не
существует
или ссылка
указывает
сама на
себя), то -xtype
будет
вести себя
так же, как
-type.
- -context
pattern
- Контекст
безопасности
файла
соответствует
glob pattern (glob -
шаблон с
подстановочными
знаками).
Примечание.
Только для
SELinux.
ДЕЙСТВИЯ
- -delete
- Удалить
файлы или
каталоги;
если
удаление
завершилось
успешно,
возвращается
true. Если
удаление
завершилось
неудачно,
выдается
сообщение
об ошибке и
возвращаемое
find
значение
будет
отличным
от нуля
(когда find
завершит
работу).
Внимание:
Не
забывайте,
что find
анализирует
командную
строку
как
выражение,
поэтому,
когда в
начале
строки
указано -delete,
find
попытается
удалить
всё, что
находится
ниже
указанных
вами
начальных
точек.
Использование
действия
-delete в
командной
строке
автоматически
включает
параметр
-depth.
Поскольку,
в свою
очередь, -depth
делает -prune
неэффективным.
Действие
-delete не может
быть
объединено
с -prune.
Часто
пользователь
может
захотеть
протестировать
командную
строку find с
помощью
параметра
-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
(истинно).
- -execdir command
;
- -execdir
command {} +
- Эти
действия
аналогичны
действию
-exec, но
указанная
команда
запускается
из
подкаталога,
содержащего
соответствующий
файл,
который
обычно не
является
каталогом,
в котором
вы
запускали
find. Как и в
случае с -exec,
фигурные
скобки {}
следует
заключать
в кавычки,
если find
вызывается
из
командной
строки. Это
гораздо
более
безопасный
метод
вызова
команд,
поскольку
он
позволяет
избежать
проблем
при
определении
путей к
соответствующим
файлам. Как
и в случае
с
действием
-exec, форма "+"
в -execdir
создаст
командную
строку для
обработки
более чем
одного
соответствующего
файла, но
при любом
вызове command
будут
перечислены
только те
файлы,
которые
существуют
в том же
подкаталоге.
Если вы
используете
это
действие,
то вы
должны
убедиться,
что ваша
переменная
окружения
PATH не
ссылается
на "."; в
противном
случае
злоумышленник
может
запускать
любые
команды,
которые он
захочет,
оставляя
файл с
соответствующим
именем в
каталоге, в
котором вы
будете
запускать
-execdir. То же
самое
относится
и к наличию
записей в
PATH, если они
являются
пустыми
или не
являются
абсолютными
именами
каталогов.
Если
какой-либо
вызов с
форматом
"+"
возвращает
ненулевое
значение,
то find
возвращает
также
ненулевое
значение.
Если find
обнаруживает
ошибку, то
это иногда
может
привести к
немедленному
завершению,
поэтому
некоторые
ожидающие
выполнения
команды
могут быть
не
выполнены.
Результат
этого
действия
зависит от
того,
используется
ли вариант
+ или ;.
Вариант
-execdir command {} +
всегда
возвращает
значение true,
в то время
как
вариант
-execdir command {} ;
возвращает
значение true
только в
том случае,
если command
возвращает
0.
- -fls file
- Истинно (True).
Аналогично
-ls, но
запись в file
выполняется
как -fprintf.
Выходной
файл
создается
всегда,
даже если
для
предиката
нет
соответствия.
Смотрите
раздел
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
для
получения
информации
о том, как
обрабатываются
необычные
символы в
именах
файлов.
- -fprint
file
- Истинно.
Вывести
полное имя
файла в
файл file.
Если файл
file не
существует
при
запуске find,
то он
создается;
если он
существует,
то он
обрезается.
Имена
файлов /dev/stdout
и /dev/stderr
обрабатываются
особым
образом;
они
относятся
к
стандартному
выводу и
стандартной
ошибке,
соответственно.
Выходной
файл
создается
всегда,
даже если
для
предиката
нет
соответствия.
Информацию
о том, как
обрабатываются
необычные
символы в
именах
файлов,
смотрите в
разделе
НЕОБЫЧНЫЕ
ИМЕНА
файлов.
- -fprint0
file
- Истинно.
Аналогично
-print 0, но
запись в file
выполняется
как -fprintf.
Выходной
файл
создается
всегда,
даже если
для
предиката
нет
соответствия.
Смотрите
раздел
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
для
получения
информации
о том, как
обрабатываются
необычные
символы в
именах
файлов.
- -fprintf file
format
- Истинно.
Аналогично
-printf, но
запись в file
также как
-fprintf.
Выходной
файл
создается
всегда,
даже если
для
предиката
нет
соответствия.
Смотрите
раздел
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
для
получения
информации
о том, как
обрабатываются
необычные
символы в
именах
файлов.
- -ls
- Истинно.
Вывести
текущий
файл в
формате ls -dils
на
стандартный
вывод.
Количество
блоков
равно 1
КБАЙТ, если
только не
задана
переменная
окружения
POSIXLY_CORRECT, в этом
случае
используются
512-байтовые
блоки.
Смотрите
раздел
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
для
получения
информации
о том, как
обрабатываются
необычные
символы в
именах
файлов.
- -ok command ;
- Аналогично
-exec, но
сначала
спросить
пользователя.
Если
пользователь
согласен,
то
выполнить
команду. В
противном
случае
просто
возвратить
значение
"ложно" (false).
Если
команда
выполняется,
то ее
стандартный
ввод
перенаправляется
с /dev/null. Это
действие
может не
указываться
вместе с
параметром
-files0-from.
- Ответ на
запрос
сопоставляется
с парой
регулярных
выражений,
чтобы
определить,
является
ли он
положительным
или
отрицательным.
Это
регулярное
выражение
получается
из системы,
если
задана
переменная
среды POSIXLY_CORRECT
или иным
образом из
трансляции
сообщений
find. Если в
системе
нет
подходящего
определения,
то будет
использовано
собственное
определение
find. В любом
случае на
интерпретацию
самого
регулярного
выражения
будут
влиять
переменные
окружения
LC_CTYPE (классы
символов) и
LC_COLLATE
(диапазоны
символов и
классы
эквивалентности).
- -okdir command
;
- Аналогично
-execdir, но
сначала
запросить
пользователя
таким же
образом,
как и для -ok.
Если
пользователь
не
согласен,
то просто
возвратить
false. Если
команда
выполняется,
то ее
стандартный
ввод
перенаправляется
с /dev/null. Это
действие
может не
указываться
вместе с
параметром
-files0-from.
- -print
- Истинно.
Вывести
полное имя
файла на
стандартный
вывод и
после
этого
ввести
новую
строку.
Если вы
передаете
выходные
данные find в
другую
программу
и
существует
малейшая
вероятность
того, что
файлы,
которые вы
ищете,
могут
содержать
новую
строку, то
вам
следует
серьезно
подумать
об
использовании
параметра
-print0 вместо
-print.
Смотрите
раздел
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
для
получения
информации
о том, как
обрабатываются
необычные
символы в
именах
файлов.
- -print0
- Истинно.
Вывести
полное имя
файла на
стандартный
вывод, за
которым
следует
нулевой
символ
(вместо
символа
новой
строки,
который
используется
-print). Это
позволяет
программам,
обрабатывающим
выходные
данные find и
корректно
интерпретировать
имена
файлов,
содержащие
символы
новой
строки или
другие
типы
пробелов.
Этот
параметр
совпадает
с
параметром
-0 в xargs.
- -printf
format
- Истинно.
Вывести format
на
стандартный
вывод,
избегая
интерпретации
"\" и
директивы
"%". Ширина и
точность
полей
могут быть
заданы как
с помощью
функции С
printf(3).
Пожалуйста,
обратите
внимание,
что многие
поля
выводятся
как %s, а не %d, а
это может
означать,
что флажки
работают
не так, как
вы
ожидаете.
Это также
означает,
что флаг "-"
действительно
работает
(он
приводит к
выравниванию
полей по
левому
краю). В
отличие от
-print, -printf не
добавляет
новую
строку в
конец
строки.
Экранирующими
элементами
и
директивами
являются:
- \a
- Сигнал
тревоги
должен
быть.
- \b
- Возврат.
- \c
- Немедленно
прекратить
вывод в
этом
формате и
очистить
выходные
данные.
- \f
- Подача
формы.
- \n
- Новая
строка
- \r
- Возврат
каретки.
- \t
- Горизонтальная
табуляция.
- \v
- Вертикальная
табуляция.
- \0
- ЗНАЧЕНИЕ ASCII
РАВНО
НУЛЮ.
- \\
- Литерал
обратная
косая
черта ("\").
- \NNN
- Символ, ASCII,
код
которого
равен NNN
(восьмеричное
число).
Символ "\",
за которым
следует
любой
другой
символ,
который
воспринимается
как
обычный
символ и
поэтому
они оба
выводятся.
- %%
- Литерал
знак
процента.
- %a
- Время
последнего
доступа к
файлу в
формате,
возвращаемом
функцией C c
time(3).
- %Ak
- Время
последнего
доступа к
файлу в
формате,
указанном
с помощью
k, которое
является
либо "@",
либо
директивой
для
функции C
strftime(3). Ниже
приведен
неполный
список
возможных
значений
для k.
Пожалуйста,
ознакомьтесь
с
документацией
по strftime(3) для
получения
полного
списка.
Некоторые
символы
спецификации
преобразования
могут быть
доступны
не во всех
системах
из-за
различий в
реализации
библиотечной
функции
strftime(3).
- @
- секунды с
января. 1, 1970, 00:00
По
Гринвичу, с
дробной
частью.
Поля
времени:
- H
- часы (00..23)
- I
- часы (01..12)
- к
- часы ( 0,..,23);
- l
- часы ( 1,..,12);
- M
- минуты (00..59)
- p
- местное
время до
полудня (AM)
или после
полудня (PM);
- r
- время, 12
часов
(чч:мм:сс [AP]M);
- S
- Секунды (00.00 ,..,
61.00); здесь
есть
дробная
часть.
- Т
- время, 24
часа
(чч:мм:сс.xxxxxxxxxx).
- +
- Дата и
время,
разделенные
знаком "+",
например
`2004-04-28+22:22:05.0'; это
расширение
GNU; время
указано в
текущем
часовом
поясе (на
это может
повлиять
установка
переменной
среды TZ);
поле
секунды
содержит
дробную
часть.
- X
- представление
местного
времени
(Ч:М:С); поле
секунды
содержит
дробную
часть.
- З
- часовой
пояс
(например, EDT)
или ничего,
если
часовой
пояс не
определён.
Поля
даты:
- a
- сокращенное
название
дня недели
в регионе
(Sun,..,Sat).
- A
- полное
название
дня недели
в локали с
переменной
длиной
(Sunday,..,Saturday).
- b
- сокращенное
название
месяца в
регионе
(Jan,..,Dec).
- B
- полное
название
месяца в
языковом
стандарте
с
переменной
длиной
(January,..,December).
- c
- дата и
время в
соответствии
с местным
стандартом
(Sat Nov 04 12:02:33 EST 1989 1989);
формат
такой же,
как для ctime(3),
поэтому
для
обеспечения
совместимости
с этим
форматом в
поле
секунды
нет
дробной
части.
- d
- сутки
месяца (01..31).
- D
- дата
(мм/дд/гг).
- F
- дата
(гггг-мм-дд).
- г
- то же, что и
b.
- j
- номер дня в
году (001..366)
- m
- месяц (01..12)
- U
- номер
недели в
году с
воскресеньем
в качестве
первого
дня недели
(00,..,53).
- w
- день
недели (0,..,6).
- W
- номер
недели в
году с
понедельником
в качестве
первого
дня недели
(00,..,53).
- x
- представление
даты в
локали
(мм/дд/гг).
- и
- две
последние
цифры года
(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.
Поддерживается
флаг
формата "-",
который
изменяет
выравнивание
поля с
выравнивания
по правому
краю
(которое
используется
по
умолчанию)
на
выравнивание
по левому
краю.
Смотрите
раздел
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
для
получения
информации
о том, как
обрабатываются
необычные
символы в
именах
файлов.
- -prune
- Истинно.
Если файл
является
каталогом,
не
заходить в
него. Если
указано -depth,
то -prune не
имеет
значения.
Поскольку
-delete
подразумевает
-depth, вы не
можете
эффективно
использовать
-prune и -delete
вместе.
Например,
чтобы
пропустить
каталог src/emacs
и все файлы
и каталоги
под ним и
вывести
имена
других
найденных
файлов,
выполните
что-то
вроде
этого:
find . -path ./src/emacs -prune -o -print
- -quit
- Немедленно
завершить
работу
(возвращается
нулевое
значение,
если
ошибок не
произошло).
Это
отличается
от -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).
Этот
символ ("!")
также
обычно
нуждается
в защите от
интерпретации
командной
оболочкой.
- -not expr
- То же, что и !
expr, но не
совместимо
с POSIX.
- expr1 expr2
- Два
выражения
подряд
объединяются
подразумеваемым
оператором
-a
(логическое
И);
значение
expr2 не
вычисляется,
если
значение
expr1 "ложно" (false).
- expr1 -a
expr2
- То же, что и
expr1 expr2.
- expr1 -and
expr2
- То же, что и
expr1 expr2, но не
совместимо
с POSIX.
- expr1 -o
expr2
- Логическое
ИЛИ; expr2 не
вычисляется,
если expr1
имеет
значение
"истинно"
(true).
- expr1 -or
expr2
- То же, что и
expr1 -o expr2, но не
совместимо
с POSIX.
- expr1 ,
expr2
- Список;
всегда
вычисляется
как expr1 и expr2.
Значение
expr1
отбрасывается;
значением
списка
является
значение
expr2.
Оператор
запятая
может
использоваться
для поиска
нескольких
различных
типов
объектов,
но только
один раз
при
перемещении
по
иерархии
файловой
системы.
Действие
-fprintf можно
использовать
для
составления
списка
различных
совпадающих
элементов
в
нескольких
разных
выходных
файлах.
Обратите
внимание,
что
оператор -a,
если он
указан
неявно
(например, в
двух
тестах,
которые
отображаются
без явного
оператора
между ними)
или явно,
имеет
более
высокий
приоритет,
чем
оператор -o.
Это
означает,
что find . -name afile -o -name bfile -print
никогда не
выведет afile.
НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ
Многие
действия find
приводят к
выводу
данных,
которые
находятся
под
контролем
других
пользователей.
Это
относится
к именам
файлов, их
размерам,
время
изменения
и так далее.
Имена
файлов
представляют
потенциальную
проблему,
поскольку
они могут
содержать
любые
символы,
кроме "\0" и
"/".
Необычные
символы в
именах
файлов
могут
привести к
неожиданным
и зачастую
нежелательным
последствиям
для вашего
терминала
(например, к
изменению
настроек
функциональных
клавиш на
некоторых
терминалах).
Различные
действия с
необычными
символами
выполняются
по-разному,
как это
описано
ниже.
- -print0,
-fprint0
- Всегда
выводит,
без
изменений,
точное имя
файла, даже
если
выходные
данные
поступают
на
терминал.
- -ls, -fls
- Необычные
символы
всегда
экранируются.
Символы
пробела,
обратной
косой
черты и
двойных
кавычек
выводятся
с
использованием
экранирования
в стиле
языка
программирования
С
(например,
"\f", "\").
Другие
необычные
символы
выводятся
с
использованием
восьмеричного
отступа.
Другие
выводимые
символы
(для -ls и -fls
это
символы
между
восьмеричными
цифрами 041 и
0176)
выводятся
как есть.
- -printf,
-fprintf
- Если
выходные
данные не
поступают
на
терминал,
то они
выводятся
как есть. В
противном
случае
результат
зависит от
используемой
директивы.
Директивы
%D, %F, %g, %G, %H, %Y и %y
расширяются
до
значений,
которые не
контролируются
владельцами
файлов и
поэтому
выводятся
как есть.
Директивы
%a, %b, %c, %d, %i, %k, %m, %M, %n, %s, %t, %u и %U
имеют
значения,
которые
находятся
под
контролем
владельцев
файлов, но
которые
нельзя
использовать
для
отправки
произвольных
данных на
терминал и
таким
образом
они
выводятся
как есть.
Директивы
%f, %h, %l, %p и %Pp
указываются
в кавычках.
Это
заключение
в кавычки
выполняется
таким же
образом,
как и для ls GNU.
Это не тот
механизм
заключения
в кавычки,
который
используется
для -ls и -fls.
Если вы в
состоянии
решить,
какой
формат
использовать
для вывода
find, то
обычно
лучше
использовать
"\0" в
качестве
символа
завершения,
нежели
использовать
новую
строку,
поскольку
имена
файлов
могут
содержать
пробелы и
символы
новой
строки.
Значение
переменной
окружения
LC_CTYPE
используется
для
определения
того, какие
символы
должны
быть
заключены
в кавычки.
- -print, -fprint
- Кавычки
обрабатываются
так же, как
и для -printf и -fprintf.
Если вы
используете
find в
скрипте
или в
ситуации,
когда
сопоставляемые
файлы
могут
иметь
произвольные
имена, то
вам
следует
рассмотреть
возможность
использования
-print0 вместо
-print.
Действия
-ok и -okdir
выводят
текущее
имя файла
как есть.
Это может
измениться
в
следующем
выпуске.
СООТВЕТСТВИЕ
СТАНДАРТАМ
Для
обеспечения
максимального
соответствия
стандарту
POSIX
необходимо
задать
переменную
окружающей
среды POSIXLY_CORRECT. В
стандарте
POSIX (IEEE Std 1003.1-2008,
редакция 2016
года)
указаны
следующие
параметры:
- -H
- Этот
параметр
поддерживается.
- -L
- Этот
параметр
поддерживается.
- -name
- Этот
параметр
поддерживается,
но
соответствие
POSIX зависит
от
соответствия
POSIX
системной
библиотечной
функции
fnmatch(3).
Начиная с
версии
утилиты find-4.2.2
метасимволы
оболочки
(например,
"*", "?" или "[]")
соответствуют
началу ".",
поскольку
этого
требует
интерпретация
IEEE PASC 126. Это
изменение,
по
отношению
к
предыдущим
версиям
утилиты find.
- -type
- Поддерживается.
POSIX
определяет
"b", "c", "d", "l", "p",
"f" и "s". GNU find
также
поддерживается
"D",
обозначающее
вход, в том
размере, в
котором
это
обеспечивается
операционной
системой.
Кроме того,
GNU find
позволяет
указывать
сразу
несколько
типов в
списке,
разделенном
запятыми.
- -ok
- Поддерживается.
Интерпретация
ответа
производится
в
соответствии
с
шаблонами
"да" ("yes") и
"нет" ("no" ),
выбранными
путем
установки
переменной
окружения
LC_MESSAGES. Когда
задана
переменная
окружения
POSIXLY_CORRECT, то эти
шаблоны
используются
для
определения
системой
положительного
ответа (да)
или
отрицательного
ответа
(нет).
Смотрите
системную
документацию
для nl_langinfo(3), в
частности,
для YESEXPR и NOEXPR.
Если
переменная
окружения
POSIXLY_CORRECT не
определена,
то вместо
этого
шаблоны
берутся из
собственного
каталога
сообщений
find.
- -newer
- Поддерживается.
Если
указанный
файл
является
символической
ссылкой, то
он всегда
разыменовывается.
Это
изменение
по
сравнению
с
предыдущим
поведением,
при
котором
для
использования
символической
ссылки
требовалось
соответствующее
время.
Смотрите
раздел
"ИСТОРИЯ"
ниже.
- -perm
- Поддерживается.
Если
переменная
окружения
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.
ПЕРЕМЕННЫЕ
СРЕДЫ
ОКРУЖЕНИЯ
- LANG
- Предоставляет
значение
по
умолчанию
для
переменных
интернационализации,
которые не
установлены
или равны
нулю.
- LC_ALL
- Если
задано
непустое
строковое
значение,
переопределяет
значения
всех
остальных
переменных
интернационализации.
- LC_COLLATE
- Стандарт POSIX
определяет,
что эта
переменная
влияет на
сопоставление
с шаблоном,
которое
будет
использоваться
для
параметра
-name. GNU find
использует
библиотечную
функцию fnmatch(3)
и поэтому
поддержка
LC_COLLATE зависит
от
системной
библиотеки.
Эта
переменная
также
влияет на
интерпретацию
ответа на
-ok; в то
время как
переменная
LC_MESSAGES
выбирает
фактический
шаблон,
используемый
для
интерпретации
ответа на
-ok,
интерпретация
любых
выражений
в скобках в
шаблоне
будет
зависеть
от LC_COLLATE.
- LC_CTYPE
- Эта
переменная
влияет на
обработку
классов
символов,
используемых
в
регулярных
выражениях,
а также на
проверку
-name, если
системная
библиотечная
функция fnmatch(3)
это
поддерживает.
Эта
переменная
также
влияет на
интерпретацию
любых
классов
символов в
регулярных
выражениях,
используемых
для
интерпретации
ответа на
запрос,
выданный
командой
-ok.
Переменная
окружения
LC_CTYPE также
влияет на
то, какие
символы
считаются
непечатаемыми
при выводе
имен
файлов;
смотрите
раздел
"НЕОБЫЧНЫЕ
ИМЕНА
ФАЙЛОВ".
- LC_MESSAGES
- Определяет
языковой
стандарт,
который
будет
использоваться
для
интернационализированных
сообщений.
Если
задана
переменная
окружения
POSIXLY_CORRECT, то она
также
определяет
интерпретацию
ответа на
запрос,
вызванный
действием
-ok.
- NLSPATH
- Определяет
расположение
каталогов
интернационализационных
сообщений.
- PATH
- Влияет на
каталоги, в
которых
выполняется
поиск
исполняемых
файлов,
вызываемых
-exec, -execdir, -ok и -okdir.
- POSIXLY_CORRECT
- Определяет
размер
блока,
используемый
параметрами
-ls и -fls. Если
задано
значение
POSIXLY_CORRECT, то
блоки
будут
иметь
размер 512
байт. В
противном
случае они
будут
иметь
размер 1024
байта.
- Установка
этой
переменной
также
отключает
предупреждающие
сообщения
(то есть
подразумевается
-nowarn) по
умолчанию,
поскольку
POSIX требует,
чтобы,
кроме
вывода для
-ok, все
сообщения,
выводимые
в
стандартный
поток
ошибок (stderr),
были
диагностическими
и должны
приводить
к
ненулевому
статусу
завершения.
- Когда
значение
POSIXLY_CORRECT не
задано,
значение -perm
+zzz
обрабатывается
точно так
же, как
значение -perm
/zzz, если
значение
+zzz не
является
допустимым
в
символическом
режиме.
Когда
задано
значение
POSIXLY_CORRECT, такие
конструкции
обрабатываются
как
ошибка.
- Когда
задан
параметр
POSIXLY_CORRECT, то
ответ на
запрос,
вызванный
действием
-ok,
интерпретируется
в
соответствии
с
системным
каталогом
сообщений,
а не в
соответствии
с
собственными
трансляциями
сообщений
find.
- TZ
- Влияет на
часовой
пояс,
используемый
для
некоторых
связанных
со
временем
директив
формата -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
появилась
в версии 5 Unix
как часть
проекта
"Рабочее
место
программиста"
и была
разработана
Диком
Хейтом (Dick Haight). В
книге Дуга
Макилроя (Doug
McIlroy)
"Исследователь
UNIX:
Аннотированные
выдержки
из
"Руководства
программиста",
1971-1986"
приведены
некоторые
дополнительные
подробности;
вы можете
прочитать
ее по
адресу
<https://www.cs.dartmouth.edu/~doug/reader.pdf>.
Утилита GNU
find
изначально
была
разработана
Эриком
Декером (Eric Decker),
с
дополнениями
Дэвида
Маккензи (David
MacKenzie), Джея
Плетта (Jay Plett) и
Тима Вуда (Tim
Wood). Идея
утилиты find -print0
и xargs -0
принадлежит
Дэну
Бернстайну
(Dan Bernstein).
СОВМЕСТИМОСТЬ
Начиная с
версии
утилиты 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:
<https://savannah.gnu.org/bugs/?group=findutils>
Основные
темы,
касающиеся
пакета
утилиты GNU find,
обсуждаются
в списке
рассылки
bug-findutils:
<https://lists.gnu.org/mailman/listinfo/bug-findutils>
АВТОРСКИЕ
ПРАВА
Авторское
право © 1990–2024 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 или
более
поздней) в
отношении
авторского
права, но
БЕЗ
КАКИХ-ЛИБО
ГАРАНТИЙ.
Если вы
обнаружите
какие-либо
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
сообщите
об этом
разработчику(ам)
по его(их)
адресу(ам)
электронной
почты или
по адресу
списка
рассылки
русских
переводчиков.