Как использовать команду find в Linux — подробное руководство

Есть ситуации, когда нужно найти конкретный файл, но система не организована и вы не помните, где он хранится. В Linux для этого есть удобные инструменты. Команда find — одна из самых гибких: она умеет фильтровать по имени, правам, расширению, размеру, времени и многому другому.
В этом руководстве вы найдёте ясные примеры, практические советы, шаблоны для типовых задач и рекомендации по безопасности.
Что делает команда find
Команда find рекурсивно обходит файловую систему, применяет заданные фильтры (тесты) и выполняет действие для найденных путей. В отличие от графических поисков она даёт детальный контроль: можно комбинировать условия, использовать регулярные выражения, изменять права файлов и удалять результаты.
Краткое определение: find — утилита для поиска файлов и каталогов по набору критериев.
Важно: чтобы искать в каталоге, у вас должны быть права на чтение этого каталога (для обхода содержимого).
Базовый синтаксис
find [путь] [опции/тесты] [действия]Пример: поиск всех текстовых файлов в /home
find /home -type f -name "*.txt"Если путь опущен, часто используют “.” — текущий каталог:
find . -type f -name "filename.txt"Поиск по имени
- -name — чувствительный к регистру поиск по шаблону (глобу).
- -iname — нечувствительный к регистру.
Примеры:
find /home -type f -name filename.txt
find /home -type f -iname "FileName.TXT"Подсказка: всегда берите шаблон в кавычки, чтобы оболочка не раскрывала звездочки.
Поиск по расширению
find /home -type f -name "*.pdf"Инверсия условия (все, кроме PDF):
find /home -type f -not -name "*.pdf"Применение действия: изменить права для найденных файлов (пример, безопаснее использовать -exec … {} +):
find /home -type f -name "*.pdf" -exec chmod 644 {} +Важно: chmod 777 делает файлы доступными для записи и исполнения всеми — не рекомендуется.
Поиск по типу объектов
Типы, которые понимает find:
- f — обычные файлы
- d — каталоги
- l — символические ссылки
- c — символьные устройства
- b — блочные устройства
- p — именованные каналы (FIFO)
- s — сокеты
Пример: найти только подкаталоги в /home
find /home -type dПоиск по размеру
Суффиксы для -size:
- b — 512-байтные блоки
- c — байты
- w — двухбайтовые слова
- k — килобайты
- M — мегабайты
- G — гигабайты
Примеры:
find /home -type f -size 1G # ровно 1 ГБ
find /home -type f -size -1G # меньше 1 ГБ
find /home -type f -size +1G # больше 1 ГБ
find /home -type f -size +1M -size -10M # от 1МБ до 10МБПоиск по временным меткам
Файлы в Linux имеют три важных времени: atime (время доступа), mtime (время последней модификации содержимого) и ctime (время изменения метаданных/прав). Для поиска используются опции:
- -atime N — доступ N дней назад
- -mtime N — модифицирован N дней назад
- -ctime N — статус (правки) N дней назад
find /home -type f -name "*.txt" -mtime 5 # изменён ровно 5 дней назад
find /home -type f -mtime +7 # изменён более 7 дней назад
find /home -type f -mtime -30 # изменён в последние 30 днейПодсказка: для более точного диапазона используйте find в связке с touch/с временными файлами или с -newermt.
# прим.: файлы изменённые после 2024-01-01
find /home -type f -newermt "2024-01-01"Поиск по правам и владельцу
- -perm MODE — точное совпадение прав. Для частичного соответствия используйте / или -.
- -user USER — файлы принадлежат USER
- -group GROUP — файлы принадлежат GROUP
find /home -type f -perm 0644
find /home -type f -perm /u=w # любой файл где владелец имеет право на запись
find /home -user aliceВнимание: точный синтаксис -perm может быть сложным; проверьте man find для разновидностей (GNU find vs BSD find).
Удаление найденных файлов — осторожно
Прямое удаление:
find /home -type f -name "*.pdf" -deleteРекомендации безопасности:
Важно: сначала выполните поиск без удаления, чтобы убедиться в результатах. Протестируйте команду с -print или замените -delete на -exec echo {} \;.
Альтернатива с xargs (быстрее при большом количестве файлов):
find /home -type f -name "*.log" -print0 | xargs -0 rm -fИли использование -exec {} +, которое эффективнее, чем \;:
find /home -type f -name "*.tmp" -exec rm -f {} +Замечание: -delete выполняется при обнаружении элемента и требует, чтобы порядок выражений допускающим его тип тестов был корректен (например, -prune перед -path и т.д.).
Примеры комбинирования и оптимизации
- Ограничение глубины поиска:
find /var/log -maxdepth 2 -type f -name "*.log"- Исключение каталогов (prune):
find / -path "/proc" -prune -o -type f -name "*.conf" -print- Использование регулярных выражений:
find /home -regextype posix-extended -regex ".*/[a-zA-Z0-9_-]+\.(jpg|png)$"- Быстрый подсчёт найденных файлов:
find /home -type f -name "*.mp3" -print | wc -l- Работа с sudo при поиске системных файлов:
sudo find / -type f -name "ssh_config"Частые ошибки и когда find ломается
- Неправильно экранированные звездочки приводят к раскрытию оболочкой; всегда берите шаблон в кавычки.
- Отсутствие прав чтения каталогов — find не сможет зайти внутрь.
- Неправильный порядок аргументов: -delete и -prune зависят от позиции в выражении.
- Различия между реализациями find (GNU vs BSD) могут давать разные опции (например, -delete доступен не везде).
Быстрый Cheat Sheet (шпаргалка)
# По имени (регистр важен / не важен)
find . -type f -name "*.conf"
find . -type f -iname "readme*"
# Типы
find / -type d # каталоги
find / -type l # симв. ссылки
# Размер
find /home -type f -size +100M
# Время
find /tmp -type f -mtime -2
# Права
find /srv -type f -perm 0644
# Удаление (ОБЯЗАТЕЛЬНО ПРОВЕРЬТЕ)
find /tmp -type f -mtime +30 -delete
# Запуск команды на найденных файлах
find . -type f -name "*.sh" -exec chmod +x {} +Методика: как безопасно удалять старые логи (SOP)
- Выполнить поиск и вывести список в файл для проверки:
find /var/log -type f -name "*.log" -mtime +180 -print > /tmp/old-logs.txt- Просмотреть /tmp/old-logs.txt, убедиться, что в списке нет нужных файлов.
- Сделать тестовый проход, показывая файлы, которые будут удалены:
cat /tmp/old-logs.txt | xargs -d '\n' -r ls -l- Удаление (через xargs или -exec) с резервным копированием при необходимости:
# Резервная копия перед удалением
tar -czf /backup/old-logs-$(date +%F).tar.gz -T /tmp/old-logs.txt
# Удаление
cat /tmp/old-logs.txt | xargs -d '\n' -r rm -fРекомендации по безопасности и производительности
- Не давайте файлам права 777 без необходимости.
- Для больших деревьев используйте -maxdepth / -mindepth и -prune, чтобы исключать временные FS (/proc, /sys).
- Для массовых операций предпочитайте -exec … {} + или find | xargs -0.
- Тестируйте команды с -print или echo перед вызовом rm/-delete.
Контрольный список по ролям
Администратор:
- Использовать sudo для системных каталогов.
- Ограничивать глубину поиска на больших FS.
- Логировать и архивировать перед массовым удалением.
Разработчик:
- Искать по расширению и времени (например, tmp-файлы старше 1 дня).
- Автоматизировать очистку в CI с осторожностью.
Обычный пользователь:
- Использовать find в своём домашнем каталоге.
- Не удалять файлы вне домашней директории без разрешения.
Примеры реальных задач
- Найти и удалить все core-файлы:
find / -type f -name "core" -exec rm -f {} +- Найти все большие файлы и показать первые 20 по размеру:
find /home -type f -printf "%s %p\n" | sort -nr | head -n 20- Поиск по нескольким расширениям:
find /photos -type f \( -iname "*.jpg" -o -iname "*.png" \) -printЧасто задаваемые вопросы
Как убедиться, что команда не удалит лишнего?
Сначала запустите find без действий, с -print. Затем замените действие на -exec echo {} \; или на запись в файл. После проверки выполняйте удаление.
Чем отличается -exec \; от -exec {} +?
-exec \; запускает команду для каждого найденного файла отдельно. -exec {} + группирует файлы и вызывает команду минимальное число раз, что обычно быстрее.
Можно ли искать по содержимому файла?
Сам find по содержимому не ищет; используйте find для сбора файлов и передавайте их в grep, например:
find /var/www -type f -name "*.php" -print0 | xargs -0 grep -n "TODO"Краткое резюме
- find — мощный инструмент для поиска и массовых операций над файлами.
- Всегда тестируйте выражение перед удалением.
- Используйте -exec {} + или xargs для производительности.
- Ограничивайте область поиска и исключайте системные псевдо-ФС.
Важное: если вы работаете на продакшене, обязательно выполните резервное копирование перед массовыми изменениями.
Если нужно, могу подготовить короткий шаблон команды под вашу задачу (удаление логов, поиск больших файлов, поиск по расширению и т. п.).
FAQ
Можно ли искать скрытые файлы?
Да. find обходит все файлы в каталоге, включая скрытые (имена, начинающиеся с “.”). Убедитесь, что путь и шаблон соответствуют.
Найдено пусто — что проверить?
Проверьте права доступа к каталогам, используемые шаблоны (кавычки), и не исключаете ли вы каталоги с помощью -prune.
Есть ли графический эквивалент find?
Графические менеджеры имеют поиск, но они обычно медленнее и менее гибки; для сложных фильтров эффективнее использовать find.
Контактная шпаргалка (короткий набор команд)
# Поиск по имени
find . -type f -name "*.md"
# Найти и распечатать путь
find /etc -type f -name "*conf" -print
# Найти старые файлы и удалить
find /tmp -type f -mtime +7 -delete
# Найти и изменить права
find /srv -type f -name "*.sh" -exec chmod +x {} +Похожие материалы
Анимация круговой диаграммы в PowerPoint
Астропрофиль в Snapchat — как создать
Отключить автоповорот экрана в Windows 8
Как подготовиться к краже Android‑телефона
Поделиться твитом в Snapchat — стикер истории