Команда find в Linux — мощный инструмент для поиска файлов и каталогов по различным критериям. Она сканирует заданную директорию (и её поддиректории) и выводит объекты, соответствующие условиям поиска.
Общий синтаксис
find <место_поиска> <критерий_поиска> <действие_с_найденными_элементами>
- место_поиска — путь, откуда начинается поиск (например,
/,~/Documents,.— текущая директория); - критерий_поиска — условия отбора (имя, тип, размер, время изменения и др.);
- действие_с_найденными_элементами — что делать с найденными объектами (вывести, удалить, выполнить команду и т. п.).
Основные критерии поиска (опции)
-name "шаблон"— поиск по имени (с учётом регистра).
Пример:find /home/user -name "report.txt"Найдёт файлreport.txtв/home/userи поддиректориях.-iname "шаблон"— поиск по имени без учёта регистра.
Пример:find . -iname "*.txt"Найдёт все файлы с расширением.txtв текущей директории (и поддиректориях), независимо от регистра.-type X— поиск по типу:f— обычный файл;d— директория;l— символическая ссылка.
Пример:
find /etc -type d -name "conf*"Найдёт директории в/etc, начинающиеся наconf.-size +N/-size -N— поиск по размеру:+N— больше N;-N— меньше N.
Единицы:c(байты),k(КБ),M(МБ),G(ГБ).
Пример:
find ~ -size +100MНайдёт файлы в домашней директории размером более 100 МБ.-mtime N— поиск по времени последнего изменения (в днях):-N— изменены менее чем N дней назад;+N— изменены более чем N дней назад.
Пример:
find /var/log -mtime -7Найдёт файлы в/var/log, изменённые за последние 7 дней.-atime N— поиск по времени последнего доступа (аналогично-mtime).-user имя— поиск файлов, принадлежащих пользователю.
Пример:find /home -user alice -name "*.pdf"Найдёт PDF-файлы пользователяalice.-empty— поиск пустых файлов и директорий.
Пример:find . -emptyНайдёт пустые объекты в текущей директории.-perm NNN— поиск по правам доступа (в числовом формате).
Пример:find /etc -perm 644Найдёт файлы с правами644в/etc.-maxdepth N— ограничить глубину поиска (N уровней поддиректорий).
Пример:find /usr -maxdepth 2 -name "python*"Найдёт файлы, начинающиеся наpython, в/usrи её поддиректориях 1‑го уровня.
Действия с найденными объектами
-print— вывести пути (по умолчанию, можно не указывать).-ls— вывести подробную информацию (какls -l).-delete— удалить найденные объекты.
Осторожно! Пример:find /tmp -name "*.tmp" -deleteУдалит все файлы с расширением.tmpв/tmp.-exec КОМАНДА {} \;— выполнить команду для каждого найденного объекта.{}— подставляется путь к файлу;\;— завершает команду.
Примеры:- Переместить файлы:
find . -name "*.log" -exec mv {} /backup \; - Изменить права:
find /var/www -type f -exec chmod 644 {} \; - Запросить подтверждение перед удалением:
find . -name "*.old" -exec rm -i {} \;
-ok— аналог-exec, но запрашивает подтверждение для каждой операции.
Пример:find ~ -name "*.bak" -ok rm {} \;
Логические операторы
- -and (и) — объединяет условия (можно опускать);
- -or (или);
- -not (не).
Примеры:
find /etc \( -name "*.conf" -or -name "*.cfg" \) -and -size -10k
Найдёт файлы с расширениями .conf или .cfg в /etc, размером менее 10 КБ.
find . -type f -not -name "*.txt"Найдёт все файлы, кроме .txt, в текущей директории.
Полезные приёмы
Скрыть ошибки «Permission denied»:
find / -name "secret.txt" 2>/dev/nullПоиск по содержимому (комбинация с grep):
find . -type f -exec grep -l "error" {} \; Найдёт файлы, содержащие строку error.
Ограничить поиск только текущими директориями (без поддиректорий):
find . -maxdepth 1 -name "*.sh"Найти и заархивировать файлы:
find /logs -mtime -1 -exec tar -rvf daily_backup.tar {} \;Важные замечания
- Поиск рекурсивный по умолчанию (проходит все поддиректории).
- Для поиска в системных директориях может потребоваться
sudo. - Всегда тестируйте команды без
-deleteили-exec rm, чтобы убедиться в корректности критериев. - Используйте кавычки для шаблонов с метасимволами (
*,?).