find — одна из базовых и мощнейших команд в арсенале системного администратора или разработчика. Она позволяет находить файлы и каталоги в файловой системе по множеству параметров: имени, времени изменения, размеру, правам доступа и многим другим. Работает рекурсивно, без графики и «магии» — просто, эффективно и понятно.
Синтаксисfind [путь] [критерий] [действия]
Критерии поиска (ключи)
| Ключ | Назначение |
|---|---|
| -name | Поиск по имени (можно использовать * и ?) |
| -iname | Как -name, но без учёта регистра |
| -type | Тип объекта (f – файл, d – каталог и т.д.) |
| -size | Размер файла (+10M, -100k, 2G и т.п.) |
| -mtime | Время модификации (в днях) |
| -atime | Время последнего доступа |
| -ctime | Время изменения метаданных |
| -perm | Поиск по правам доступа (например, 644, /u=w) |
| -user | Поиск по владельцу файла |
| -group | Поиск по группе |
| -empty | Пустые файлы или каталоги |
| -maxdepth | Максимальная глубина поиска |
| -mindepth | Минимальная глубина |
| -inum <inode> | Поиск файла с указанным inode |
Примеры: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
Действия
| Ключ | Назначение |
|---|---|
| Печатает найденные пути (по умолчанию) | |
| -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. Она может искать по имени, дате, размеру, правам и сразу выполнять нужные действия: удалять, копировать, архивировать. Главное — использовать её с головой: проверяй результат перед удалением, ограничивай глубину поиска и не бойся комбинировать фильтры.