Linux

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

В этом гайде вы освоите основные и продвинутые техники поиска файлов в Linux с помощью утилит find, locate и fd. Мы рассмотрим поиск по имени, содержимому, размеру, дате изменения и правам доступа на практических примерах.

Обновлено 17 февраля 2026 г.
15-30 мин
Низкая
FixPedia Team
Применимо к:Linux (все дистрибутивы)Bash/Zshfindutils 4.5+util-linux 2.25+

Введение / Зачем это нужно

Поиск файлов в Linux — одна из самых частых задач для системного администратора, разработчика и обычного пользователя. Вместо графического браузера вы используете мощную командную строку, которая позволяет находить файлы по любому критерию: имени, размеру, дате, содержимому или правам доступа. Этот гайд научит вас эффективно использовать утилиты find, locate и fd для решения повседневных задач, от простого "где мой конфиг?" до поиска gigabyte-файлов, заполняющих диск.

После прохождения вы сможете:

  • Быстро находить файлы по имени с помощью масок.
  • Искать файлы по размеру и дате, чтобы освободить место.
  • Находить исполняемые файлы или файлы с определёнными правами.
  • Выбирать правильный инструмент (find, locate, fd) для каждой ситуации.

Требования / Подготовка

  1. Доступ к терминалу Linux (любой дистрибутив: Ubuntu, CentOS, Arch, Fedora и т.д.).
  2. Базовые знания навигации (cd, ls).
  3. Права на чтение каталогов, в которых будете искать. Для системных каталогов (/etc, /var) может потребоваться sudo.
  4. Для утилиты 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 fd
    
    После установки команда может называться fdfind (в 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 убедитесь, что вывод соответствует ожиданиям:

  1. Проверьте полные пути найденных файлов. Не нашли ли вы лишнее?
  2. Для критичных операций (удаление, изменение) сначала просмотрите список без действий (-ls в find или просто вывод).
  3. Убедитесь, что результаты не устарели (особенно для locate). Если ищете недавно созданный файл, а locate его не находит — используйте find.
  4. Проверьте права доступа. Если команда ничего не нашла, попробуйте запустить с sudo (если ищете в системных каталогах).

Возможные проблемы

Проблема: find ничего не находит, хотя файл точно существует.

Решение:

  1. Проверьте правильность пути для поиска. Убедитесь, что каталог, где лежит файл, указан верно (. для текущей папки).
  2. Проверьте регистр в имени файла при использовании -name. Используйте -iname для регистронезависимого поиска.
  3. Проверьте права доступа на каталоги выше по иерархии. Если у вас нет прав на чтение (r) каталога, find не сможет в него заглянуть. Попробуйте sudo find ....
  4. Убедитесь, что файл не является символьной ссылкой, указывающей в недоступное место. Используйте -type l для поиска ссылок.

Проблема: find работает слишком медленно на больших дисках.

Решение:

  1. Ограничьте глубину поиска с помощью -maxdepth N (максимум N уровней вложенности) и -mindepth N (минимум N уровней). Например, find / -maxdepth 3 -name "*.log" ищет только в первых трёх подкаталогах корня.
  2. Используйте locate для поиска по имени, если актуальность данных в базе (обычно сутки) вас устраивает.
  3. Используйте fd, который оптимизирован для скорости и по умолчанию игнорирует ненужные каталоги (.git, node_modules).
  4. Сузьте путь поиска. Вместо 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 корректно их обрабатывает.

Часто задаваемые вопросы

Чем команда find отличается от locate?
Как искать файлы по содержимому?
Что делать, если find не находит файл, который точно есть?
Есть ли более быстрая альтернатива find?

Полезное

Поиск по имени файла (точное совпадение)
Поиск по шаблону (подстрока или маска)
Поиск по размеру файла
Поиск по дате изменения
Поиск по правам доступа (правам)
Использование locate для быстрого поиска

Эта статья помогла вам решить проблему?