Инструкция

Команда find в Linux: поиск файлов по имени, размеру и дате — примеры

Обновлено: · Skillaria.Top

Команда find обходит дерево каталогов и выбирает файлы по условиям: find /path -name '*.log' ищет по имени, -type f только файлы, -size +100M крупнее 100 МБ, -mtime -7 изменённые за неделю. Условия комбинируются, а над найденным можно выполнить действие через -exec, -delete или передать список в xargs.

Команда find обходит дерево каталогов и находит файлы по условиям: имени, типу, размеру, дате изменения, владельцу и правам. Общая схема — find [где искать] [условия] [действие]. Ниже собраны find linux примеры для типичных задач: найти конфиг, вычистить старые логи, отыскать то, что съело место на диске.

Синтаксис команды find

find /var/log -type f -name '*.log' -mtime +30 -print

Разберём по частям:

  • /var/log — стартовая точка. Можно указать несколько каталогов подряд или . (текущий). Без пути GNU find ищет в текущем каталоге.
  • -type f -name '*.log' -mtime +30 — условия (в документации они называются тестами). Между ними по умолчанию стоит логическое «И».
  • -print — действие: вывести путь. Оно подставляется само, если других действий нет.

find идёт рекурсивно, во все вложенные каталоги. Если вы запускаете его от обычного пользователя по системным путям, вывод засорят строки Permission denied. Уберите их, перенаправив поток ошибок:

find / -name 'nginx.conf' 2>/dev/null

Поиск по имени: -name и -iname

Условие -name сравнивает только имя файла (без пути) с шаблоном. Шаблон поддерживает * (любые символы), ? (один символ) и [abc] (один из перечисленных).

# точное имя
find /etc -name 'hosts'

# все файлы .conf
find /etc -name '*.conf'

# без учёта регистра: README.md, readme.MD, Readme.md
find ~/projects -iname 'readme.md'

# report_1.csv ... report_9.csv
find . -name 'report_?.csv'

Шаблон всегда берите в кавычки. Без них оболочка сама раскроет *.conf по файлам текущего каталога, и find получит не шаблон, а список имён — результат будет неожиданным или команда упадёт с ошибкой paths must precede expression.

Поиск по пути: -path и -regex

Если важен каталог, а не только имя, используйте -path — он сравнивает с шаблоном весь путь:

# файлы .js только внутри каталогов src
find . -path '*/src/*' -name '*.js'

Для сложных шаблонов есть -regex (регулярное выражение тоже по полному пути) и -iregex без учёта регистра:

find . -regextype posix-extended -regex '.*\.(jpg|jpeg|png)$'

Как исключить каталог

Чтобы find не заходил, например, в node_modules или .git, применяют -prune:

find . -path ./node_modules -prune -o -name '*.js' -print

Читается так: «если путь — ./node_modules, не спускаться в него, иначе (-o) вывести файлы *.js». Явный -print в конце обязателен, иначе в вывод попадёт и сам исключённый каталог. Проще, но медленнее, вариант — -not -path '*/node_modules/*': find всё равно обойдёт каталог, просто отфильтрует результат.

Поиск по типу: -type

ЗначениеЧто ищет
-type fобычные файлы
-type dкаталоги
-type lсимволические ссылки
-type sсокеты
-type pименованные каналы (FIFO)
# только каталоги с именем logs
find / -type d -name 'logs' 2>/dev/null

# пустые файлы и пустые каталоги
find . -type f -empty
find . -type d -empty

# битые символические ссылки
find . -xtype l

Поиск по размеру: -size

Условие -size принимает число с суффиксом: c — байты, k — килобайты, M — мегабайты, G — гигабайты. Знак + означает «больше», - — «меньше», без знака — «ровно».

# файлы больше 100 МБ во всей системе
find / -type f -size +100M 2>/dev/null

# от 10 до 50 МБ
find . -type f -size +10M -size -50M

# меньше 1 КБ
find . -type f -size -1k

Есть нюанс: размер округляется вверх до единицы измерения. Поэтому -size -1M найдёт только пустые файлы — любой непустой файл занимает «как минимум 1 мегабайт» после округления. Для точных границ используйте меньшие единицы: -size -1024k.

Что занимает место на диске

Связка find с ls и sort показывает самые крупные файлы:

find /var -type f -size +50M -exec ls -lh {} + 2>/dev/null | sort -k5 -rh | head
-rw-r----- 1 syslog adm  1.2G Oct 14 09:12 /var/log/syslog.1
-rw-r--r-- 1 root   root 412M Oct 10 03:00 /var/backups/db.sql.gz
-rw-r----- 1 root   adm   96M Oct 14 09:15 /var/log/nginx/access.log

Для оценки целых каталогов удобнее du -sh, а find хорош, когда место съел один огромный файл где-то в глубине.

Поиск по дате: -mtime, -mmin, -newer

У каждого файла три временные метки, и find умеет фильтровать по каждой:

УсловиеМеткаЕдиница
-mtime / -mminизменение содержимогосутки / минуты
-atime / -aminпоследнее чтениесутки / минуты
-ctime / -cminизменение метаданных (права, владелец, имя)сутки / минуты

Знаки работают так же, как у размера: -mtime -7 — изменён меньше 7 суток назад, -mtime +30 — больше 30 суток назад.

# изменённые за последнюю неделю
find ~/projects -type f -mtime -7

# логи старше 30 дней
find /var/log -type f -name '*.log' -mtime +30

# изменённые за последние 15 минут
find /etc -type f -mmin -15

Сутки считаются целыми периодами по 24 часа, дробная часть отбрасывается. Из-за этого -mtime +1 находит файлы старше 48 часов, а не 24 — частая ловушка. Если нужна точность, переходите на минуты: -mmin +1440.

Файлы новее другого файла или даты

# изменённые после того, как менялся deploy.lock
find . -type f -newer deploy.lock

# изменённые после конкретной даты (GNU find)
find . -type f -newermt '2026-10-01'

# в интервале дат
find . -type f -newermt '2026-10-01' ! -newermt '2026-10-08'

Поиск по владельцу и правам

# файлы пользователя alice
find /home -user alice

# файлы, у которых нет существующего владельца (после удаления пользователя)
find / -nouser 2>/dev/null

# файлы с правами ровно 777
find /var/www -type f -perm 777

# файлы, доступные на запись всем
find /var/www -perm -o=w

# файлы с битом SUID — полезно при аудите безопасности
find / -perm -4000 -type f 2>/dev/null

У -perm три формы: без знака — права совпадают точно, с - — установлены как минимум все указанные биты, с / — установлен хотя бы один из них.

Логика условий: И, ИЛИ, НЕ

Условия по умолчанию соединяются через «И». Для «ИЛИ» служит -o, для отрицания — ! или -not. Группировка — скобками, которые нужно экранировать от оболочки:

# картинки jpg или png
find . -type f \( -name '*.jpg' -o -name '*.png' \)

# всё, кроме файлов .tmp
find . -type f ! -name '*.tmp'

Без скобок -type f отнесётся только к первому условию из пары «ИЛИ», и в результат попадут каталоги с именем *.png. Пробелы вокруг \( и \) обязательны.

Глубина поиска: -maxdepth и -mindepth

# только в текущем каталоге, без вложенных
find . -maxdepth 1 -type f -name '*.sh'

# начиная со второго уровня вложенности
find . -mindepth 2 -name '*.md'

# не переходить на другие файловые системы
find / -xdev -type f -size +1G

Ставьте -maxdepth сразу после пути, перед остальными условиями, — иначе GNU find выдаст предупреждение. Опция -xdev полезна при поиске по /: find не полезет в /proc, сетевые и подключённые диски.

Действия над найденным: -exec, -delete, xargs

-exec: выполнить команду для каждого файла

Вместо {} find подставит путь к файлу. Команда заканчивается \; или +:

# по одному запуску на файл
find . -name '*.sh' -exec chmod +x {} \;

# все файлы одним списком — быстрее
find . -name '*.log' -exec gzip {} +

# с подтверждением для каждого файла
find . -name '*.bak' -ok rm {} \;

Вариант с + собирает пути в пачки и запускает команду гораздо реже, поэтому на тысячах файлов он в разы быстрее. Вариант с \; нужен, когда команда принимает только один файл или {} стоит не в конце.

-delete: удалить найденное

# сначала посмотреть, что попадёт под удаление
find /tmp/build -type f -name '*.o' -mtime +7

# потом удалить
find /tmp/build -type f -name '*.o' -mtime +7 -delete

Всегда запускайте команду без -delete и проверяйте список. И ставьте -delete последним: find выполняет выражение слева направо, и find . -delete -name '*.o' удалит вообще всё в каталоге, а уже потом проверит имя.

find и xargs

Классическая связка — передать список файлов другой программе через xargs. Чтобы не сломаться на именах с пробелами, используйте разделитель нулевой байт:

find . -type f -name '*.txt' -print0 | xargs -0 wc -l

Флаг -P у xargs запускает обработку параллельно:

find ./images -name '*.png' -print0 | xargs -0 -P 4 -n 10 optipng

find и grep: поиск текста внутри файлов

find ищет файлы, а не их содержимое. Чтобы найти строку внутри выбранных файлов, отдайте их grep:

# где в конфигах встречается listen 8080
find /etc/nginx -type f -name '*.conf' -exec grep -Hn 'listen 8080' {} +
/etc/nginx/sites-enabled/app.conf:4:    listen 8080;

Флаг -H печатает имя файла, -n — номер строки, а grep -l выведет только имена файлов с совпадением. Если фильтр нужен лишь по расширению, хватит самого grep: grep -rn --include='*.conf' 'listen 8080' /etc/nginx.

Свой формат вывода: -printf

GNU find умеет печатать не только путь. Например, размер, дату и имя:

find . -maxdepth 1 -type f -printf '%s\t%TY-%Tm-%Td\t%p\n' | sort -n

Здесь %s — размер в байтах, %T... — дата изменения по частям, %p — путь. Это удобно для скриптов: не нужно разбирать вывод ls.

Шпаргалка: find linux примеры на каждый день

ЗадачаКоманда
Найти файл по имениfind / -name 'file.txt' 2>/dev/null
Без учёта регистраfind . -iname '*.jpg'
Только каталогиfind . -type d -name 'cache'
Файлы больше 1 ГБfind / -xdev -type f -size +1G
Изменённые за суткиfind . -type f -mtime -1
Изменённые за часfind . -type f -mmin -60
Удалить логи старше 30 днейfind /var/log/app -name '*.log' -mtime +30 -delete
Пустые каталогиfind . -type d -empty
Поменять права всем каталогамfind . -type d -exec chmod 755 {} +
Строка внутри файловfind . -name '*.py' -exec grep -l 'TODO' {} +
Посчитать файлыfind . -type f | wc -l

Типичные ошибки

  • Шаблон без кавычек. find . -name *.log ломается, если в текущем каталоге есть хоть один .log. Пишите '*.log'.
  • Лавина Permission denied. Добавьте 2>/dev/null или запустите через sudo, если действительно нужен весь диск.
  • -delete не на своём месте. Он всегда последний, а перед ним — проверочный прогон без удаления.
  • Имена с пробелами в конвейере. find ... | xargs rm разрежет «My File.txt» на два аргумента. Используйте -print0 и xargs -0 или -exec.
  • Ожидание точных суток от -mtime. Для точных интервалов берите -mmin или -newermt.

Итог

find — универсальный инструмент поиска по файловой системе: путь, условия по имени, типу, размеру, дате и правам, затем действие. Освойте пять опор — -name, -type, -size, -mtime и -exec ... +, — и большинство задач решится одной строкой. Приведённые find linux примеры стоит повторить у себя в терминале, а связку find с grep, sed и awk мы разбираем на практике в лекции курса по Linux об обработке текста в терминале.

Частые вопросы

Чем find отличается от locate?

locate ищет по заранее построенной базе имён, поэтому работает мгновенно, но не видит файлы, созданные после последнего обновления базы командой updatedb. find обходит диск в реальном времени и умеет фильтровать по размеру, дате и правам.

Как найти файл по содержимому, а не по имени?

Сам find содержимое не читает. Используйте grep -rn 'текст' /путь или связку find . -name '*.conf' -exec grep -l 'текст' {} +.

Почему find работает медленно на корне диска?

Он обходит все каталоги, включая /proc, /sys и подключённые диски. Ограничьте поиск конкретным каталогом, добавьте -xdev и -maxdepth или исключите лишнее через -prune.

Можно ли отсортировать результаты find по дате?

Да: find . -type f -printf '%T@ %p\n' | sort -n выведет файлы от старых к новым, где %T@ — время изменения в секундах с начала эпохи.

Как найти и удалить пустые каталоги?

Команда find . -type d -empty -delete удалит все пустые каталоги, включая те, что опустели после удаления вложенных. Сначала запустите её без -delete и проверьте список.

Разберите тему на видео

Эта тема подробно разобрана с практикой в курсе «Linux: с нуля до уверенного администрирования».

Перейти к курсу