Введение / Зачем это нужно
Поиск файлов в Linux — одна из самых частых задач для системного администратора, разработчика и обычного пользователя. Вместо графического браузера вы используете мощную командную строку, которая позволяет находить файлы по любому критерию: имени, размеру, дате, содержимому или правам доступа. Этот гайд научит вас эффективно использовать утилиты find, locate и fd для решения повседневных задач, от простого "где мой конфиг?" до поиска gigabyte-файлов, заполняющих диск.
После прохождения вы сможете:
- Быстро находить файлы по имени с помощью масок.
- Искать файлы по размеру и дате, чтобы освободить место.
- Находить исполняемые файлы или файлы с определёнными правами.
- Выбирать правильный инструмент (
find,locate,fd) для каждой ситуации.
Требования / Подготовка
- Доступ к терминалу Linux (любой дистрибутив: Ubuntu, CentOS, Arch, Fedora и т.д.).
- Базовые знания навигации (
cd,ls). - Права на чтение каталогов, в которых будете искать. Для системных каталогов (
/etc,/var) может потребоватьсяsudo. - Для утилиты
fd(опционально, но рекомендуется):
После установки команда может называться# Ubuntu/Debian sudo apt update && sudo apt install fd-find # Fedora sudo dnf install fd-find # Arch Linux sudo pacman -S fd # macOS (brew) brew install fdfdfind(в Debian/Ubuntu) илиfd.
Пошаговая инструкция
Шаг 1: Базовый синтаксис команды find
Команда find имеет универсальный синтаксис:
find [путь_для_поиска] [критерий] [действие]
[путь_для_поиска]: Каталог, начиная с которого искать (.— текущая папка,/— корень системы).[критерий]: Условие для поиска (имя, размер, дата и т.д.). Можно комбинировать через-a(И) или-o(ИЛИ).[действие]: Что делать с найденными файлами. Если не указать,findпросто выведет пути.
Пример: Найти все файлы с расширением .conf в /etc и его подкаталогах.
find /etc -name "*.conf"
💡 Совет: Всегда заключайте шаблон в кавычки (
"или'), чтобы shell не пытался его раскрывать до передачиfind.
Шаг 2: Поиск по имени с учётом регистра
По умолчанию -name чувствителен к регистру. Для регистронезависимого поиска используйте -iname:
# Найти Readme.md, README.md, readme.MD
find /путь/к/проекту -iname "readme.md"
Шаг 3: Поиск по типу файла
Используйте -type для фильтрации по типу объекта файловой системы:
f— обычный файлd— каталогl— символьная ссылкаc— символьное устройствоb— блочное устройство
Пример: Найти только каталоги с именем logs:
find / -type d -name "logs"
Шаг 4: Комбинирование критериев (Логические операторы)
Для сложных запросов объединяйте условия:
-a(И) — по умолчанию, если условия идут подряд.-o(ИЛИ) — альтернатива.!или-not— отрицание.
Пример: Найти все .log файлы в /var/log, размер которых больше 10 МБ И изменявшиеся за последние 7 дней:
find /var/log -name "*.log" -size +10M -mtime -7
Пример 2: Найти файлы с расширением .tmp ИЛИ .temp в домашнем каталоге:
find ~ -name "*.tmp" -o -name "*.temp"
⚠️ Важно: При использовании
-oчасто нужно группировать условия скобками\( ... \), чтобы задать приоритет. Например, ищем.bakфайлы ВЛОЖЕННЫЕ в каталогахcacheилиtemp:find / -type d \( -name "cache" -o -name "temp" \) -exec find {} -name "*.bak" \;
Шаг 5: Поиск по размеру файла
Опция -size использует суффиксы:
c— байтыk— килобайты (1024 байта)M— мегабайтыG— гигабайты
Знаки:
+— больше указанного-— меньше указанного- Нет знака — точное совпадение (редко используется)
Пример: Найти файлы, занимающие ровно 0 байт (пустые):
find /tmp -size 0c
Пример: Найти файлы от 500 МБ до 2 ГБ:
find / -size +500M -size -2G
Шаг 6: Поиск по дате и времени
find работает с днями (не часами) по умолчанию. Есть три основных критерия:
-mtime N— когда содержимое файла было изменено N дняй назад.-atime N— когда файл был доступен (прочитан, выполнен) N дней назад.-ctime N— когда метаданные (права, владелец) были изменены N дней назад.
Пояснение про дни:
-mtime 0— изменялось сегодня (в последние 24 часа).-mtime -1— изменялось менее 24 часов назад (аналог "вчера и сегодня").-mtime +1— изменялось более 48 часов назад (старше 2 дней).
Для поиска по часам и минутам используйте:
-mmin N— минуты с последнего изменения.-amin N— минуты с последнего доступа.-cmin N— минуты с последнего изменения метаданных.
Практические примеры:
# Найти все файлы, изменённые за последние 2 часа (120 минут)
find /var/www -mmin -120
# Найти файлы, к которым не обращались более 30 дней (возможно, можно архивировать)
find /home -atime +30
# Найти файлы, созданные вчера (примерно 24-48 часов назад)
find /backup -mtime 1
Шаг 7: Поиск по правам доступа и владельцу
По правам (perm):
-perm mode— точное совпадение прав (например,-perm 644).-perm -mode— все биты изmodeдолжны быть установлены (логическое И). Например,-perm -u=xнайдёт файлы, у которых владелец имеет право на выполнение, независимо от других прав.-perm /mode— хотя бы один бит изmodeустановлен (логическое ИЛИ). Например,-perm /u=x,g=wнайдёт файлы, где владелец может выполнять ИЛИ группа может писать.
Пример: Найти все исполняемые файлы (x для кого-либо) в /usr/bin:
find /usr/bin -perm /111
Или, что то же самое:
find /usr/bin -perm /a=x
По владельцу/группе:
-user username— файлы, принадлежащие пользователю.-group groupname— файлы, принадлежащие группе.
Пример: Найти все файлы, принадлежащие пользователю www-data (часто для веб-серверов):
find /var -user www-data
Шаг 8: Выполнение действий с найденными файлами
Критерии поиска часто комбинируют с действиями через -exec или -delete.
-exec: Выполняет указанную команду для каждого найденного файла. {} заменяется на имя файла. Завершается \;.
# Найти все .tmp файлы и удалить их (ОСТОРОЖНО!)
find /tmp -name "*.tmp" -exec rm {} \;
# Найти все .log файлы и сжать их gzip
find /var/log -name "*.log" -exec gzip {} \;
# Найти файлы, доступные для записи группе, и вывести их права
find / -type f -perm -g=w -exec ls -l {} \;
-delete: Удаляет найденные файлы. Будьте предельно осторожны! Сначала проверьте результат без -delete.
# Безопасный способ: сначала посмотреть, что будет удалено
find /tmp -name "*.cache" -ls
# Затем, если всё верно, удалить
find /tmp -name "*.cache" -delete
-ok: Аналог -exec, но запрашивает подтверждение перед выполнением каждой команды.
find . -name "*.bak" -ok rm {} \;
# Будет спрошено: < rm ... > ? (y/n)
Шаг 9: Альтернативы: locate и fd
locate — быстрый поиск по базе данных
Работает в разы быстрее find, так как ищет не в файловой системе, а в обновляемой раз в сутки базе данных (/var/lib/mlocate/mlocate.db).
locate имя_файла # Простой поиск
locate -i имя_файла # Без учёта регистра
locate -c имя_файла # Только количество найденных файлов
Обновление базы вручную (требует sudo):
sudo updatedb
⚠️ Важно:
locateне видит файлы, созданные после последнегоupdatedb. Для поиска совсем новых файлов используйтеfind.
fd — современная, быстрая и удобная замена find
Упрощённый синтаксис, цветной вывод, игнорирование файлов из .gitignore по умолчанию.
fd шаблон # Ищет в текущей директории (рекурсивно)
fd -e js # Ищет файлы с расширением .js
fd -g '*.py' # Глобbing-шаблон (как в shell)
fd -s +1M # По размеру (больше 1 МБ)
fd -t f # Только файлы (-t d для каталогов)
fd -I # Не игнорировать скрытые файлы (.gitignore по умолчанию)
Пример: Найти все файлы Dockerfile (с учётом регистра) в проекте:
fd Dockerfile
Пример: Найти Python-файлы, изменённые за последние неделю:
fd -e py -c time -1w
Проверка результата
После выполнения команды find/locate/fd убедитесь, что вывод соответствует ожиданиям:
- Проверьте полные пути найденных файлов. Не нашли ли вы лишнее?
- Для критичных операций (удаление, изменение) сначала просмотрите список без действий (
-lsвfindили просто вывод). - Убедитесь, что результаты не устарели (особенно для
locate). Если ищете недавно созданный файл, аlocateего не находит — используйтеfind. - Проверьте права доступа. Если команда ничего не нашла, попробуйте запустить с
sudo(если ищете в системных каталогах).
Возможные проблемы
Проблема: find ничего не находит, хотя файл точно существует.
Решение:
- Проверьте правильность пути для поиска. Убедитесь, что каталог, где лежит файл, указан верно (
.для текущей папки). - Проверьте регистр в имени файла при использовании
-name. Используйте-inameдля регистронезависимого поиска. - Проверьте права доступа на каталоги выше по иерархии. Если у вас нет прав на чтение (
r) каталога,findне сможет в него заглянуть. Попробуйтеsudo find .... - Убедитесь, что файл не является символьной ссылкой, указывающей в недоступное место. Используйте
-type lдля поиска ссылок.
Проблема: find работает слишком медленно на больших дисках.
Решение:
- Ограничьте глубину поиска с помощью
-maxdepth N(максимум N уровней вложенности) и-mindepth N(минимум N уровней). Например,find / -maxdepth 3 -name "*.log"ищет только в первых трёх подкаталогах корня. - Используйте
locateдля поиска по имени, если актуальность данных в базе (обычно сутки) вас устраивает. - Используйте
fd, который оптимизирован для скорости и по умолчанию игнорирует ненужные каталоги (.git,node_modules). - Сузьте путь поиска. Вместо
find /ищите в конкретном разделе (find /home).
Проблема: Нужно найти файлы, содержащие определённый текст.
Решение: find для этого не предназначен. Используйте grep:
grep -r "искомый_текст" /путь/к/поиску/
Для поиска только среди файлов с определённым расширением:
grep -r --include="*.log" "ERROR" /var/log/
Или комбинируйте find и grep:
find . -name "*.py" -exec grep -l "def main" {} \;
# Находит все .py файлы, содержащие строку "def main", и выводит их имена.
Проблема: find выводит очень много результатов, нужно только количество.
Решение: Добавьте | wc -l (pipe to word count, lines):
find /var/log -name "*.log" | wc -l
Или используйте встроенную опцию find -printf '.' | wc -c (более быстрее для огромного количества файлов).
Проблема: Нужно найти и обработать файлы с пробелами или спецсимволами в именах.
Решение: Всегда используйте -exec или -print0 в связке с xargs -0. Простой вывод (find . -name "*.txt") может сломаться при пробелах.
# Безопасная обработка с помощью xargs
find . -name "*.txt" -print0 | xargs -0 rm
# Или с помощью -exec (более безопасно)
find . -name "*.txt" -exec rm {} \;
Опция -print0 выводит имена, разделённые NUL-символом (\0), а xargs -0 корректно их обрабатывает.