find

Find

Команда find в Linux — мощный инструмент для поиска файлов и каталогов по различным критериям. Она сканирует заданную директорию (и её поддиректории) и выводит объекты, соответствующие условиям поиска.

Общий синтаксис

find <место_поиска> <критерий_поиска> <действие_с_найденными_элементами>
  • место_поиска — путь, откуда начинается поиск (например, /, ~/Documents, . — текущая директория);
  • критерий_поиска — условия отбора (имя, тип, размер, время изменения и др.);
  • действие_с_найденными_элементами — что делать с найденными объектами (вывести, удалить, выполнить команду и т. п.).

Основные критерии поиска (опции)

  1. -name "шаблон" — поиск по имени (с учётом регистра).
    Пример:find /home/user -name "report.txt" Найдёт файл report.txt в /home/user и поддиректориях.
  2. -iname "шаблон" — поиск по имени без учёта регистра.
    Пример:find . -iname "*.txt" Найдёт все файлы с расширением .txt в текущей директории (и поддиректориях), независимо от регистра.
  3. -type X — поиск по типу:
    • f — обычный файл;
    • d — директория;
    • l — символическая ссылка.
      Пример:
    find /etc -type d -name "conf*" Найдёт директории в /etc, начинающиеся на conf.
  4. -size +N / -size -N — поиск по размеру:
    • +N — больше N;
    • -N — меньше N.
      Единицы: c (байты), k (КБ), M (МБ), G (ГБ).
      Пример:
    find ~ -size +100M Найдёт файлы в домашней директории размером более 100 МБ.
  5. -mtime N — поиск по времени последнего изменения (в днях):
    • -N — изменены менее чем N дней назад;
    • +N — изменены более чем N дней назад.
      Пример:
    find /var/log -mtime -7 Найдёт файлы в /var/log, изменённые за последние 7 дней.
  6. -atime N — поиск по времени последнего доступа (аналогично -mtime).
  7. -user имя — поиск файлов, принадлежащих пользователю.
    Пример:find /home -user alice -name "*.pdf" Найдёт PDF-файлы пользователя alice.
  8. -empty — поиск пустых файлов и директорий.
    Пример:find . -empty Найдёт пустые объекты в текущей директории.
  9. -perm NNN — поиск по правам доступа (в числовом формате).
    Пример:find /etc -perm 644 Найдёт файлы с правами 644 в /etc.
  10. -maxdepth N — ограничить глубину поиска (N уровней поддиректорий).
    Пример:find /usr -maxdepth 2 -name "python*" Найдёт файлы, начинающиеся на python, в /usr и её поддиректориях 1‑го уровня.

Действия с найденными объектами

  1. -print — вывести пути (по умолчанию, можно не указывать).
  2. -ls — вывести подробную информацию (как ls -l).
  3. -delete — удалить найденные объекты.
    Осторожно! Пример:find /tmp -name "*.tmp" -delete Удалит все файлы с расширением .tmp в /tmp.
  4. -exec КОМАНДА {} \; — выполнить команду для каждого найденного объекта.
    • {} — подставляется путь к файлу;
    • \; — завершает команду.
      Примеры:
    • Переместить файлы:find . -name "*.log" -exec mv {} /backup \;
    • Изменить права:find /var/www -type f -exec chmod 644 {} \;
    • Запросить подтверждение перед удалением:find . -name "*.old" -exec rm -i {} \;
  5. -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, чтобы убедиться в корректности критериев.
  • Используйте кавычки для шаблонов с метасимволами (*, ?).