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
Действия
Ключ | Назначение |
---|---|
Печатает найденные пути (по умолчанию) | |
-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. Она может искать по имени, дате, размеру, правам и сразу выполнять нужные действия: удалять, копировать, архивировать. Главное — использовать её с головой: проверяй результат перед удалением, ограничивай глубину поиска и не бойся комбинировать фильтры.