junior
Как искать файлы с помощью find?
Команда find рекурсивно обходит дерево каталогов и находит файлы по различным критериям: имени, типу, размеру, времени модификации, правам доступа.
Базовый синтаксис
Пример
find [путь] [условия] [действие]
Поиск по имени
Пример
find . -name "*.java" # Все .java файлы (с учётом регистра)
find . -iname "readme*" # Без учёта регистра
find /opt -name "application.yml" # Искать в /opt
find . -name "*.java" -o -name "*.xml" # .java ИЛИ .xml файлы (-o = or)
find . -not -name "*.class" # Все файлы, кроме .class
Поиск по типу
Пример
find . -type f # Только файлы
find . -type d # Только директории
find . -type l # Только символические ссылки
find . -type f -name "*.log" # Файлы с расширением .log
Поиск по размеру
Пример
find . -size +100M # Файлы больше 100 МБ
find . -size -1k # Файлы меньше 1 КБ
find . -size +10M -size -100M # От 10 до 100 МБ
# Суффиксы: c (байты), k (КБ), M (МБ), G (ГБ)
Поиск по времени
Пример
find . -mtime -7 # Изменённые за последние 7 дней
find . -mtime +30 # Изменённые более 30 дней назад
find . -mmin -60 # Изменённые за последние 60 минут
find . -newer reference.txt # Новее указанного файла
Поиск по правам и владельцу
Пример
find . -user developer # Файлы пользователя developer
find . -group dev # Файлы группы dev
find . -perm 755 # Файлы с правами ровно 755
find . -perm -u+x # Файлы, исполняемые владельцем
Действия над найденными файлами
Пример
# Выполнить команду для каждого файла ({} заменяется именем файла)
find . -name "*.log" -exec rm {} \;
# Более эффективно — передать все файлы одной командой
find . -name "*.log" -exec rm {} +
# Удаление (встроенное действие)
find /tmp -type f -mtime +30 -delete
# Показать подробную информацию
find . -name "*.java" -ls
# Спрашивать перед выполнением
find . -name "*.tmp" -ok rm {} \;
Исключение директорий
Пример
# Исключить target и .git
find . -type f -name "*.java" \
-not -path "*/target/*" \
-not -path "*/.git/*"
# Или с -prune (эффективнее — не заходит в директорию вовсе)
find . -path ./target -prune -o -name "*.java" -print
find vs locate
| Характеристика | find |
locate |
|---|---|---|
| Скорость | Медленнее (обход файловой системы) | Мгновенный (по индексу) |
| Актуальность | Всегда актуальный результат | Может быть устаревшим |
| Гибкость | Множество критериев | Только по имени |
| Обновление | Не требуется | sudo updatedb (обычно по cron) |
Пример
locate "application.yml" # Мгновенный поиск по базе
sudo updatedb # Обновить базу
На собеседовании: интервьюер ждёт знания разницы между
-exec {} \;(запуск по одному файлу) и-exec {} +(пакетный запуск — значительно быстрее). Частая ошибка — забывать\;в конце-exec, что приводит к синтаксической ошибке.