find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. Может производить поиск в одном или нескольких каталогах с использованием критериев, заданных пользователем. По умолчанию find возвращает все ы в рабочем каталоге. Более того, find позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются регулярные выражения. Для поиска файлов по содержимому следует пользоваться утилитой grep.
Список ключей -amin — время последнего обращения к файлу (в минутах). -atime — время последнего обращения к файлу (в днях). -cmin — время последнего изменения владельца или прав доступа к файлу (в минутах). -ctime — время последнего изменения владельца или прав доступа к файлу (в днях). -delete — удалять найденные файлы. -depth или -d — начинать поиск с самых глубоких уровней вложенности, а не с корня каталога. -empty — только пустые каталоги. -exec command {} \; — выполняет над найденным файлом указанную команду; обратите внимание на синтаксис. -group — владелец: группа пользователя или GID. -L — разворачивать символические ссылки. -ls — генерирует вывод как команда ls -dgils. -maxdepth — максимальный уровень вложенности для поиска. «-maxdepth 1» ограничивает поиск текущим каталогом. -mmin — время последнего изменения файла (в минутах). -mount или -xdev — не переходить на другие файловые системы. -mtime — время последнего изменения файла (в днях). -name — искать по маске имени файла. Опция -name регистрочувствительная, то есть различает прописные и строчные буквы. Для поиска файлов без учета регистров воспользуйтесь опцией -iname. -newer другой_файл — искать файлы, созданные позже, чем другой_файл. -ok — перед выполнением команды, указанной в -exec, выдаёт запрос. -P — не разворачивать символические ссылки (поведение по умолчанию). -perm — указываются права доступа. -print0 — выводит путь к текущему файлу на стандартный вывод, за которым следует символ ASCII NULL (код символа 0). -print — показывает на экране найденные файлы. -prune — используется, когда вы хотите исключить из поиска определённые каталоги. -regex — искать по имени файла, используя регулярные выражения. -regextype тип — указание типа используемых регулярных выражений. -size — размер: указывается в 512-байтных блоках или байтах (признак байтов — символ «c» за числом). -type — тип искомого: f=файл, d=каталог (directory), l=ссылка (link), p=канал (pipe), s=сокет. -user — владелец: имя пользователя или UID.
Примеры
Поиск в текущем каталоге Найти все файлы в текущем и дочерних каталогах, название которых начинается с my.
Обратите внимание: в понятиях unix файлом является всё, в том числе и каталоги. find . -name 'my*' Для поиска исключительно по именам файлов нужно использовать дополнительную опцию -type f find . -name 'my*' -type f
Поиск в определенном каталоге Найти все файлы в корневом и дочерних каталогах, название которых начинается с my.
Поиск в корневом каталоге эквивалентен поиску по всему компьютеру. find / -name 'my*'
Поиск файлов в каталогах /usr/local/man и /opt/local/man 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\)" Предыдущий пример можно также записать с помощью регулярных выражений find . -type f -regex "\(my\|qu\).*" Выполнение команды Опция -exec выполняет следующую за ней команду и подставляет вместо {} текущий файл. Найти все каталоги ниже указанного каталога и изменить им права доступа с помощью команды chmod: 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 "{}" \; Или воспользоваться опцией -print0 и -0 позволяет обрабатывать аргументы, содержащие пробелы и кавычки: find /path -type d -print0 | xargs -0 chmod 0755
Поиск всех файлов php.ini в текущем каталоге и замена текста в каждом найденном файле с помощью команды sed. 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 Поиск файлов, принадлежащих определенному пользователю В данном примере поиск осуществляется по файлам принадлежащим пользователю с именем ilyafind . -user ilya
Поиск файлов c ограничением глубины Глубина поиска указывается относительно каталога, указанного в аргументе команды.
Начинает поиск в папке /var/www, но не глубже /var/www/*/*/*/* . find /var/www -maxdepth 4 -name 'restore.php'
Поиск файлов с перечислением каталогов. Ищет файлы в указанных каталогах. find /var/spool/postfix/{deferred,active,maildrop,incoming}/ -type f
Поиск файлов по маске с исключением. Ищет файлы php в текущем каталоге, исключая index.php find . -name "*.php" ! -name "index.php"
Рекурсивное удаление файла от текущего каталога, на заданную глубину. Удаляет все файлы 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 "имя искомого файла" |& grep -v 'Отказано в доступе'
find / -name "имя искомого файла" |& grep -v 'Permission denied'
Ссылки
«Как выловить битые ссылки» — с помощью find’а найти все битые ссылки. Поиск файлов в Linux — разнообразные примеры использования команды find
Категория:Утилиты Unix