Find

Материал из VAAL-WIKI
Версия от 09:34, 10 апреля 2017; Vaal (обсуждение | вклад) (Новая страница: «<code>'''find'''</code> — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐под…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. Может производить поиск в одном или нескольких каталогах с использованием критериев, заданных пользователем. По умолчанию, find возвращает все файлы в рабочей директории. Более того, find позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются регулярные выражения. Для поиска файлов по содержимому следует пользоваться утилитой grep.

Список ключей

  • -name — искать по имени файла, при использовании подстановочных образцов параметр заключается в кавычки. Опция `-name' различает прописные и строчные буквы; чтобы использовать поиск без этих различий, воспользуйтесь опцией `-iname'.
  • -type — тип искомого: f=файл, d=каталог, l=ссылка (link), p=канал (pipe), s=сокет.
  • -user — владелец: имя пользователя или UID.
  • -group — владелец: группа пользователя или GID.
  • -perm — указываются права доступа.
  • -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом).
  • -atime — время последнего обращения к файлу (в днях).
  • -amin — время последнего обращения к файлу (в минутах).
  • -ctime — время последнего изменения владельца или прав доступа к файлу (в днях).
  • -cmin — время последнего изменения владельца или прав доступа к файлу (в минутах).
  • -mtime — время последнего изменения файла (в днях).
  • -mmin — время последнего изменения файла (в минутах).
  • -newer другой_файл — искать файлы созданные позже, чем другой_файл.
  • -delete — удалять найденные файлы.
  • -ls — генерирует вывод как команда ls -dgils.
  • -print — показывает на экране найденные файлы.
  • -print0 — выводит путь к текущему файлу на стандартный вывод, за которым следует символ ASCII NULL (код символа 0).
  • -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис.
  • -ok — перед выполнением команды указанной в -exec, выдаёт запрос.
  • -depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога.
  • -maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 0» ограничивает поиск текущим каталогом.
  • -prune — используется, когда вы хотите исключить из поиска определённые каталоги.
  • -mount или -xdev — не переходить на другие файловые системы.
  • -regex — искать по имени файла используя регулярные выражения.
  • -regextype тип — указание типа используемых регулярных выражений.
  • -P — не разворачивать символьные ссылки (поведение по умолчанию).
  • -L — разворачивать символические ссылки.
  • -empty — только пустые каталоги.

Примеры

Поиск в текущей директории

Найти все файлы, начиная с текущей директории, название которых начинается на my.

find . -name 'my*'

Поиск в определенном каталоге

Найти все файлы, начиная с корневой директории, название которых начинается на my.

find / -name 'my*'

Поиск в директориях /usr/local/man и /opt/local/man файлов, название которых начинается на my.

find /usr/local/man /opt/local/man -name 'my*'

Поиск по нескольким именам файлов

Найти все файлы, начиная с текущей директории, название которых начинается на my или qu. Обратите внимание, что по умолчанию все аргументы соединены с помощью логического и (опция '-a'). Если необходимо объединить несколько аргументов логическим или — используйте опцию '-o'.

find . \( -name "my*" -o -name "qu*" \) -print

Поиск нескольких типов файлов, используя регулярные выражения

Найти все графические файлы, начиная с текущей директории, используя регулярные выражения.

find . -type f -regex ".*\.\(jpg\|jpeg\|gif\|png\|JPG\|JPEG\|GIF\|PNG\)"

Выполнение команды

Опция -exec выполняет следующую за ней команду и подставляет вместо {} текущий файл. Найти все каталоги ниже указанного каталога и изменить им права доступа:

find /path -type d -exec chmod 0755 {} \;

Опция -exec работает примерно в 10 раз медленнее, чем перенаправление вывода через xargs, поэтому данный код рекомендуется писать следующим образом:

find /path -type d | xargs chmod 0755

Однако, директории с именами, содержащими пробелы, методом перенаправления через xargs обработаны не будут, поэтому следует использовать первый вариант, дополненный:

find /path -type d -exec chmod 0755 "{}" \;

Или (что лучше) вот так (опция -- -0 позволяет обрабатывать аргументы, содержащие пробелы и кавычки, т.к. использует NULL ("\0") вместо символов-разделителей "пробел" и "перевод строки"):

find /path -type d -print0 | xargs -0 chmod 0755

Поиск всех файлов php.ini от текущего каталога и замена текста в каждом найденном файле.

find . -name 'php.ini' -exec sed -i 's/log_errors = Off/log_errors = On/g' "{}" \;

Сложный поиск в нескольких видах файлов и замен текста в каждом из них, от текущего каталога и ниже.

find . -regex ".*\.\(php\|js\|css\)" -exec sed -i 's/\/bitrix\/templates\//\/local\/templates\//g' "{}" \;

Поиск в зависимости от времени создания

Вывести список файлов во всей файловой системе, изменённых в течение последней минуты:

find / -mmin -1 -print

Вывести список файлов во всей файловой системе, которые были изменены более 31 дня назад:

find / -mtime +31 -print

Поиск по размеру файла

Вывести список файлов во всей файловой системе, чей размер больше 100 Мб:

find / -size +100M -print

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

find . -user <userid>

Поиск файлов c ограничением глубины

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

find . -maxdepth 4 -name 'restore.php'

Поиск файлов с перечислением каталогов.

Ищет файлы в указанных каталогах.

find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f

Рекурсивное удаление файла от текущего каталога, на заданную глубину.

Удаляет все файлы restore.php от текущего каталога, но не глубже 4 уровня вложенности относительно корневого каталога /

Начинает поиск в папке /var/www, но не глубже /var/www/*/*/ и удаляет все файлы restore.php в найденном.

find /var/www -maxdepth 4 -name 'restore.php' -exec rm -r {} \;

Игнорирование ошибок

Если при поиске возникает ошибка (например — нет доступа чтения из каталога) то вывод команды становится менее информативным. Перенаправьте вывод STDERR в /dev/null.

find / -name 'secret.keys' -print 2>/dev/null

Примеры

Поиск в текущей директории

Поиск файлов

find . -name "my*" -type f

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

Поиск всех файлов для владельца user

find . -user <userid>