find
find — утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных операционных системах. Может производить поиск в одном или нескольких каталогах с использованием критериев, заданных пользователем. По умолчанию, find возвращает все файлы в рабочей директории. Более того, find позволяет применять пользователю определённые действия ко всем найденным файлам. Также поддерживаются регулярные выражения. Для поиска файлов по содержимому следует пользоваться утилитой grep.
Содержание
- 1 Список ключей
- 2 Примеры
- 2.1 Поиск в текущей директории
- 2.2 Поиск в определенном каталоге
- 2.3 Поиск по нескольким именам файлов
- 2.4 Поиск нескольких типов файлов, используя регулярные выражения
- 2.5 Выполнение команды
- 2.6 Поиск в зависимости от времени создания
- 2.7 Поиск по размеру файла
- 2.8 Поиск файлов принадлежащих определенному пользователю
- 2.9 Поиск файлов c ограничением глубины
- 2.10 Поиск файлов с перечислением каталогов.
- 2.11 Рекурсивное удаление файла от текущего каталога, на заданную глубину.
- 2.12 Игнорирование ошибок
- 3 Ссылки
Список ключей[править | править код]
-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’а найти все битые ссылки. (рус.)
- Поиск файлов в Linux - разнообразные примеры использования команды find (рус.)

