Gymterview
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, что приводит к синтаксической ошибке.