Диск забит под завязку. Конфиг 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" {} \;
Сохраните статью в закладки. Эти команды вы будете использовать каждый день.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



