Поиск файлов в Linux: шпаргалка по find, locate и grep

Полное руководство по поиску файлов в Linux. Команды find, locate, grep для поиска по имени, содержимому, размеру. Wildcards, регулярные выражения, практические примеры для Astra Linux и других дистрибутивов

Диск забит под завязку. Конфиг nginx где-то есть, но где — непонятно. В логах мелькала ошибка, но в каком файле — уже не вспомнить. Знакомо?

В Linux три инструмента, которые решают эти задачи за секунды: find, locate и grep. Проблема не в том, что они сложные — проблема в том, что никто не объясняет, когда какой использовать и почему.

Эта статья — практическая шпаргалка с реальными сценариями. Никакой академической воды. Только команды, которые можно скопировать и запустить прямо сейчас.

Быстрая шпаргалка: какую команду использовать

Если нет времени читать всё — вот главная таблица:

Задача Команда
Быстро найти файл по имени locate -i имя_файла
Найти файл с точным именем (актуально) find / -name "имя" 2>/dev/null
Найти все файлы с расширением find / -name "*.log" 2>/dev/null
Найти большие файлы (>100 МБ) find / -type f -size +100M 2>/dev/null
Найти файлы старше 30 дней find /tmp -mtime +30
Найти текст внутри файлов grep -r "текст" /путь
Найти строку в одном файле grep -n "текст" файл
Найти конфиги, содержащие слово grep -r "слово" /etc --include="*.conf"

Два подхода к поиску: реальное время vs база данных

Прежде чем разбирать команды — важно понять одно различие, которое объясняет, почему команд несколько.

Поиск в реальном времени — система сканирует файловую систему прямо сейчас. Результат всегда актуальный, но на большой системе это может занять десятки секунд. Команда: find.

Поиск по индексу — система использует заранее составленную базу данных файлов. Результат мгновенный, но если файл создан после последнего обновления базы — он не найдётся. Команда: locate.

Поиск по содержимому — это отдельная история. grep ищет не файл по имени, а текст внутри файлов. Незаменим для работы с конфигами и логами.

Команда find: точный поиск с фильтрами

find — самый мощный инструмент. Умеет искать по имени, размеру, дате, типу, правам доступа и выполнять команды над найденными файлами.

Базовый синтаксис:

find [путь] [условия] [действия]

Поиск по имени

Ключ -name — с учётом регистра. -iname — без учёта регистра.

# Найти файл nginx.conf везде в системе
find / -name nginx.conf 2>/dev/null

# То же самое, но найдёт и NGINX.CONF, и Nginx.Conf
find / -iname nginx.conf 2>/dev/null

# Найти все файлы .conf в /etc
find /etc -name "*.conf"

# Найти все файлы, начинающиеся с "error"
find /var/log -name "error*"

Важно: маску всегда берите в кавычки. Без кавычек shell подставит файлы из текущей папки до того, как find начнёт работу — результат будет непредсказуемым.

Проблема Permission denied

При поиске по всей системе вы увидите много ошибок вида:

find: '/root': Permission denied
find: '/proc/tty/driver': Permission denied

Есть два способа от них избавиться:

# Запустить с правами root
sudo find / -name nginx.conf

# Или перенаправить ошибки в /dev/null
find / -name nginx.conf 2>/dev/null

2>/dev/null — перенаправляет поток ошибок (stderr) в «чёрную дыру». Ошибки исчезают, видите только результаты.

Поиск по типу файла

Ключ -type позволяет искать только файлы, только папки или только символические ссылки:

Тип Что ищем
f Обычный файл
d Директория (папка)
l Символическая ссылка
# Найти только папки с именем "backup
find / -type d -name "backup" 2>/dev/null

# Найти только файлы (не папки) с расширением .log
find /var -type f -name "*.log"

# Найти все символические ссылки в /usr/bin
find /usr/bin -type l

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

Ключ -size. Префикс + — больше, - — меньше, без префикса — точно:

# Файлы больше 100 МБ
find / -type f -size +100M 2>/dev/null

# Файлы меньше 10 КБ
find ~ -type f -size -10k

# Файлы от 1 МБ до 500 МБ
find / -type f -size +1M -size -500M 2>/dev/null

Единицы измерения: c — байты, k — килобайты, M — мегабайты, G — гигабайты.

Поиск по дате изменения

Ключ -mtime — дата изменения в днях. Префикс - — за последние N дней, + — старше N дней:

# Файлы, изменённые за последние 7 дней
find /var/log -type f -mtime -7

# Файлы, не трогавшиеся больше 30 дней
find /tmp -type f -mtime +30

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

Выполнение команд над найденными файлами

Ключ -exec — выполняет команду для каждого найденного файла. {} заменяется путём к файлу:

# Удалить все файлы .tmp в /tmp
find /tmp -name "*.tmp" -exec rm {} \;

# Сделать все .sh файлы исполняемыми
find ~ -name "*.sh" -exec chmod +x {} \;

# Показать размер каждого лог-файла
find /var/log -name "*.log" -exec ls -lh {} \;

# Скопировать все конфиги в резервную папку
find /etc -name "*.conf" -exec cp {} /backup/configs/ \;

Разница между \; и +:

# \; — запускает команду для каждого файла отдельно (медленнее)
find /tmp -name "*.log" -exec rm {} \;

# + — передаёт все файлы сразу одной командой (быстрее)
find /tmp -name "*.log" -exec rm {} +

Команда locate: быстрый поиск по индексу

locate ищет по заранее созданной базе данных. Работает мгновенно даже на больших системах — но только если база актуальна.

Установка

# Ubuntu / Debian / Astra Linux
sudo apt install mlocate

# CentOS / RHEL
sudo yum install mlocate

# После установки — создать базу данных
sudo updatedb

Первое создание базы может занять несколько минут. В дальнейшем updatedb запускается автоматически раз в сутки через cron.

Основные примеры

# Найти файл по имени
locate nginx.conf

# Без учёта регистра
locate -i xorg.conf

# Показать только первые 10 результатов
locate -l 10 python

# Посчитать количество найденных файлов
locate -c .log

# Найти файлы с регулярным выражением
locate -r "\.conf$"

Главное отличие от find

Параметр find locate
Скорость Медленно (сканирует диск) Мгновенно (по индексу)
Актуальность Всегда актуально Зависит от updatedb
Фильтры Размер, дата, тип, права Только имя
Новые файлы Находит сразу Только после updatedb

Правило выбора: используйте locate для быстрого поиска по имени. Если файл не найден или нужны фильтры — переходите к find.

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

grep — это не поиск файлов, а поиск по содержимому. Незаменим при работе с конфигами, логами и исходным кодом.

Базовый синтаксис:

grep [опции] "шаблон" файл(ы)

Основные опции

Опция Что делает
-i Игнорировать регистр
-r Рекурсивный поиск в подпапках
-n Показать номера строк
-l Показать только имена файлов
-L Файлы, где шаблон НЕ найден
-c Количество совпадений
-v Строки, НЕ содержащие шаблон
-w Искать целое слово
-A N Показать N строк после совпадения
-B N Показать N строк до совпадения

Практические примеры

Поиск в одном файле:

# Найти все строки с "error" в syslog
grep "error" /var/log/syslog

# То же, без учёта регистра, с номерами строк
grep -in "error" /var/log/syslog

# Показать 3 строки контекста вокруг совпадения
grep -n -A 3 -B 3 "error" /var/log/syslog

Рекурсивный поиск:

# Найти "server_name" во всех файлах в /etc/nginx
grep -r "server_name" /etc/nginx

# Только в файлах .conf
grep -r "server_name" /etc/nginx --include="*.conf"

# Показать только имена файлов, содержащих "password"
grep -rl "password" /etc

Фильтрация вывода:

# Строки, НЕ содержащие "DEBUG" (убрать мусор из логов)
grep -v "DEBUG" /var/log/app.log

# Только уникальные совпадения
grep "error" /var/log/syslog | sort | uniq

# Посчитать количество ошибок
grep -c "error" /var/log/syslog

Поиск с регулярными выражениями:

# Найти IP-адреса в конфиге
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /etc/network/interfaces

# Найти строки, начинающиеся с "#" (комментарии)
grep "^#" /etc/ssh/sshd_config

# Найти пустые строки
grep "^$" файл

# Найти строки, заканчивающиеся на ";"
grep ";$" /etc/mysql/my.cnf

Комбинация grep и find

Мощный приём — найти файлы через find, затем искать в них через grep:

# Найти все .conf файлы, содержащие "listen 80"
find /etc -name "*.conf" -exec grep -l "listen 80" {} \;

# Более короткий вариант
grep -r "listen 80" /etc --include="*.conf"

# Найти .log файлы за последние 7 дней, содержащие "CRITICAL"
find /var/log -name "*.log" -mtime -7 -exec grep -l "CRITICAL" {} \;

Боевые сценарии

Вот реальные задачи, с которыми сталкивается каждый администратор.

Сценарий 1: Диск забит — найти виновника

# Топ-10 самых больших файлов в системе
find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10

# Найти файлы больше 1 ГБ
find / -type f -size +1G 2>/dev/null

# Найти большие логи в /var
find /var -type f -name "*.log" -size +100M

# Найти файлы, которые не открывались больше 90 дней
find / -type f -atime +90 -size +10M 2>/dev/null

Сценарий 2: Найти конфиг с нужной настройкой

# Найти все конфиги nginx с директивой proxy_pass
grep -r "proxy_pass" /etc/nginx --include="*.conf" -l

# Посмотреть в каком файле прописан конкретный виртуальный хост
grep -r "example.com" /etc/nginx --include="*.conf" -n

# Найти все файлы, где упоминается конкретный IP
grep -r "192.168.1.100" /etc 2>/dev/null

Сценарий 3: Разобраться с логами

# Найти все ошибки за сегодня
grep "error\|Error\|ERROR" /var/log/syslog | grep "$(date '+%b %e')"

# Найти ошибки в логах за последние 7 дней
find /var/log -name "*.log" -mtime -7 -exec grep -l "error" {} \;

# Посмотреть контекст ошибки (5 строк до и после)
grep -n -A 5 -B 5 "segfault" /var/log/syslog

# Найти все уникальные ошибки
grep -i "error" /var/log/syslog | sort | uniq -c | sort -rn | head -20

Сценарий 4: Почистить мусор

# Удалить все файлы .tmp старше 7 дней
find /tmp -name "*.tmp" -mtime +7 -exec rm {} \;

# Удалить пустые файлы
find /var/log -type f -empty -delete

# Найти дубликаты по имени (не удалять, только показать)
find / -name "*.conf" 2>/dev/null | sort

# Удалить старые логи (старше 30 дней)
find /var/log -name "*.log" -mtime +30 -exec rm {} \;

Сценарий 5: Аудит системы

# Найти файлы с SUID-битом (потенциальные уязвимости)
find / -perm -4000 -type f 2>/dev/null

# Найти файлы, доступные для записи всем
find / -perm -o+w -type f 2>/dev/null

# Найти файлы без владельца
find / -nouser -o -nogroup 2>/dev/null

# Найти .ssh файлы с неправильными правами
find ~/.ssh -type f ! -perm 600 2>/dev/null

Частые ошибки

Ошибка 1: Маска без кавычек в find

# Неправильно — shell раскроет маску до запуска find
find ~ -name *.txt

# Правильно
find ~ -name "*.txt"

Ошибка 2: locate не находит только что созданный файл

База данных не обновлена. Решение:

sudo updatedb
locate новый_файл

Ошибка 3: grep ищет только в текущей папке

# Неправильно — ищет только в файлах текущей папки
grep "текст" *

# Правильно — рекурсивно по всем подпапкам
grep -r "текст" /путь/к/папке

Ошибка 4: Permission denied засоряет вывод

# Убрать ошибки доступа
find / -name "файл" 2>/dev/null

Ошибка 5: find -exec работает медленно

# Медленно — запускает команду для каждого файла отдельно
find /tmp -name "*.log" -exec rm {} \;

# Быстрее — передаёт все файлы одной командой
find /tmp -name "*.log" -exec rm {} +

# Ещё вариант через xargs
find /tmp -name "*.log" | xargs rm

FAQ

В чём разница между find и locate?

find сканирует диск в реальном времени — медленно, но всегда актуально. locate ищет по базе данных — мгновенно, но база может быть устаревшей. Для быстрого поиска по имени — locate, для точного поиска с фильтрами — find.

Как искать без учёта регистра?

find / -iname "файл" 2>/dev/null   # find
locate -i файл                      # locate
grep -i "текст" файл                # grep

Как найти все файлы с расширением .log?

# В текущей папке
ls *.log

# Рекурсивно через find (актуально)
find / -name "*.log" 2>/dev/null

# Через locate (быстро)
locate -r "\.log$"

Как найти самые большие файлы?

# Файлы больше 1 ГБ
find / -type f -size +1G 2>/dev/null

# Топ-10 самых больших файлов
find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10

Как найти текст во всех файлах папки?

# Рекурсивно во всех файлах
grep -r "текст" /путь

# Только в .txt файлах
grep -r "текст" /путь --include="*.txt"

# С номерами строк
grep -rn "текст" /путь

Как удалить найденные файлы?

# Через -exec
find /tmp -name "*.tmp" -exec rm {} \;

# Через -delete (быстрее, но осторожно!)
find /tmp -name "*.tmp" -delete

Важно: перед удалением проверьте, что находите правильные файлы — запустите без -delete или -exec rm.

Заключение

Три инструмента — три задачи:

  • find — когда нужен точный результат с фильтрами. Медленно, но надёжно.
  • locate — когда нужно быстро найти файл по имени. Мгновенно, но база должна быть свежей.
  • grep — когда ищете текст внутри файлов. Незаменим для конфигов и логов.

Алгоритм на каждый день:

# 1. Сначала попробуйте locate — быстро
locate -i имя_файла

# 2. Если не нашли или нужны фильтры — find
find / -name "имя" 2>/dev/null

# 3. Если ищете текст внутри файлов — grep
grep -r "текст" /путь --include="*.conf"

# 4. Комбинируйте для сложных задач
find /etc -name "*.conf" -mtime -7 -exec grep -l "server" {} \;

Сохраните статью в закладки. Эти команды вы будете использовать каждый день.

Андрей Анатольевич
Author: Андрей Анатольевич

Руководитель ИТ / Кризис-менеджер 25 лет в IT: от инженера в МегаФоне до руководителя отдела. Знаю, как выглядит бардак: нестабильные сети, устаревшая инфраструктура, конфликты в команде, раздутые сроки. Помогаю бизнесу выходить из кризиса: навожу порядок в легаси, стабилизирую то, что разваливается, выстраиваю прогнозируемые процессы. Не раз возвращал к жизни ИТ-структуры — знаю цену хаосу. 📍 Ищу проект для полной реорганизации / стабилизации. 📬 Telegram: @over_dude ✉️ mail@it-apteka.com

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →

Мы ВКонтакте

IT-Аптека — советы, новости и помощь рядом.

Вступить в группу ВКонтакте →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх