Команда find

find — одна из базовых и мощнейших команд в арсенале системного администратора или разработчика. Она позволяет находить файлы и каталоги в файловой системе по множеству параметров: имени, времени изменения, размеру, правам доступа и многим другим. Работает рекурсивно, без графики и “магии” — просто, эффективно и понятно.

Синтаксис
find [путь] [критерий] [действия]

Критерии поиска (ключи)

КлючНазначение
-nameПоиск по имени (можно использовать * и ?)
-inameКак -name, но без учёта регистра
-typeТип объекта (f – файл, d – каталог и т.д.)
-sizeРазмер файла (+10M, -100k, 2G и т.п.)
-mtimeВремя модификации (в днях)
-atimeВремя последнего доступа
-ctimeВремя изменения метаданных
-permПоиск по правам доступа (например, 644, /u=w)
-userПоиск по владельцу файла
-groupПоиск по группе
-emptyПустые файлы или каталоги
-maxdepthМаксимальная глубина поиска
-mindepthМинимальная глубина

Примеры:
find /home -name "file.txt"
find . -type f -size +10M
find /var/log -mtime -7
find . -atime 0
find . -atime +7

Глубина поиска: -maxdepth и -mindepth
-maxdepth N Ограничивает максимальную глубину, на которую find будет заходить в подкаталоги.
0 — только текущий каталог
1 — текущий + его прямые подкаталоги
2 — плюс подкаталоги подкаталогов
Пример:
find . -maxdepth 1 -type f
Найдёт только файлы в текущем каталоге (не в подкаталогах).

-mindepth N Устанавливает минимальную глубину, начиная с которой начнёт возвращать результаты.
Пример:
find . -mindepth 2 -type f
Пропустит текущий каталог и его прямые подкаталоги, начнёт с уровня ниже.

Уровни подкаталогов:
. → глубина 0
./dir → глубина 1
./dir/subdir → глубина 2
./dir/subdir/file → глубина 3

Подстановочные символы в -name

СимволЗначение
*Заменяет любое количество любых символов, включая ноль
?Заменяет ровно один любой символ
[]Указывает набор допустимых символов на этом месте

* — любое количество символов
find . -name "*.log"
Найдёт:
error.log
system.log
a.log
но не error.LOG (чувствительно к регистру)

? — ровно один символ
find . -name "file?.txt"
Найдёт:
file1.txt
fileA.txt
file_.txt
Но не найдёт:
file12.txt
file.txt

[] — один из символов из набора
find . -name "file[1-3].txt"
Найдёт:
file1.txt
file2.txt
file3.txt

Действия

КлючНазначение
-printПечатает найденные пути (по умолчанию)
-deleteУдаляет найденные файлы (будьте осторожны! лучше сначала прогнать команду с -print, что бы увидеть какие файлы будут удалены)
-exec CMD {} \;Выполняет команду над каждым найденным объектом, {} — место файла
-exec CMD {} +То же, но передаёт группой файлов за один вызов команды (эффективнее)
-lsвыводит подробную информацию о каждом найденном файле в формате, аналогичном ls -l

Примеры:
find . -type f -name "*.log" -exec rm {} \;
Удаление файлов по одному. Выполняется вот как:
rm ./log1.log
rm ./log2.log
rm ./log3.log

find . -type f -name "*.log" -exec rm {} +
Удаление всех файлов одним вызовом. Выполняется вот как:
rm ./log1.log ./log2.log ./log3.log

Заключение

Команда find — это настоящий швейцарский нож для работы с файлами в Linux. Она может искать по имени, дате, размеру, правам и сразу выполнять нужные действия: удалять, копировать, архивировать. Главное — использовать её с головой: проверяй результат перед удалением, ограничивай глубину поиска и не бойся комбинировать фильтры.

Прокрутить вверх