linux scripting

locate

Быстрый поиск файлов по предварительно построенной базе данных имён файлов

Описание

locate — утилита быстрого поиска файлов, работающая с предварительно построенной базой данных путей файловой системы. В отличие от find, который обходит файловую систему в реальном времени, locate выполняет поиск в индексной базе данных /var/lib/mlocate/mlocate.db (или /var/cache/plocate/plocate.db для modern plocate). Это делает поиск практически мгновенным даже на системах с миллионами файлов.

База данных строится и обновляется командой updatedb, которая обычно запускается автоматически через cron раз в сутки. Это означает, что locate может не находить файлы, созданные после последнего обновления базы, и может показывать удалённые файлы. Современные системы используют plocate (Petter's locate) вместо устаревшего mlocate — он значительно быстрее и использует меньше памяти.

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

Синтаксис

locate [OPTIONS] PATTERN [PATTERN...] locate [OPTIONS] -r REGEXP

Обновление базы данных

sudo updatedb # обновить базу данных вручную updatedb --prunepaths="/tmp /proc /sys" # исключить директории locate -S # статистика базы данных (plocate/mlocate)

Флаги и опции

ФлагОписание
-iCase insensitive: игнорировать регистр при поиске. По умолчанию locate уже нечувствителен к регистру (в большинстве конфигураций), но -i гарантирует это явно
-r REGEXPRegex: искать по регулярному выражению вместо шаблона glob. Используется POSIX ERE (extended regex)
-cCount: вывести только количество найденных совпадений, без самих путей
-l NLimit: вывести не более N результатов. Полезно для больших выборок: locate -l 10 pattern
-n NLimit (синоним -l в некоторых версиях): ограничить количество результатов числом N
-eExisting: проверять существование каждого найденного файла перед выводом. Устраняет «мертвые» записи о удалённых файлах (медленнее)
-wWhole path: совпадение должно быть со всем путём целиком, а не подстрокой
-bBasename: искать только в имени файла (без директорий), а не в полном пути. Пример: locate -b sshd_config
-SStatistics: показать статистику базы данных — количество директорий, файлов, размер БД
-d DBDatabase: использовать указанный файл базы данных вместо системного. Полезно для пользовательских баз
-0Null: разделять результаты нулевым байтом вместо новой строки. Для безопасной передачи через пайп в xargs -0
-AAll patterns: файл должен соответствовать ВСЕМ указанным паттернам (поведение по умолчанию)

Паттерны использования

Базовый поиск файлов

# Найти все файлы с "nginx" в пути
locate nginx

# Найти только по имени файла (без каталогов)
locate -b nginx.conf

# Регистронезависимый поиск
locate -i README

# Ограничить количество результатов
locate -l 5 python

# Посчитать количество совпадений
locate -c "*.log"

Поиск с glob-паттернами

# Только .conf файлы
locate "*.conf" | grep nginx

# Все файлы в конкретной директории
locate "/etc/nginx/*"

# Имя файла по паттерну
locate -b "*.service"

# Файлы, начинающиеся на "ssh"
locate -b "ssh*"

# Несколько паттернов (AND)
locate nginx conf

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

# Файлы с версией в имени
locate -r "python[0-9]\.[0-9]"

# Конфиги только в /etc
locate -r "^/etc/.*\.conf$"

# Скрипты с расширением .sh или .bash
locate -r "\.\(sh\|bash\)$"

# Бинарники в /usr/bin
locate -r "^/usr/bin/[a-z]"

# Регистронезависимо + regex
locate -ir "readme\.(md|txt|rst)$"

Фильтрация результатов через grep

# Найти только в /etc
locate nginx | grep "^/etc/"

# Исключить директории tmp
locate "*.py" | grep -v "/tmp/"

# Только реальные файлы (исключить симлинки)
locate sshd | xargs -I{} sh -c '[ -f "{}" ] && echo "{}"'

# Найти файл и открыть его директорию
locate -b "nginx.conf" | head -1 | xargs dirname

Проверка актуальности и управление базой

# Проверить когда обновлялась база
stat /var/lib/mlocate/mlocate.db
# или для plocate:
stat /var/cache/plocate/plocate.db

# Обновить базу вручную
sudo updatedb

# Статистика базы
locate -S

# Только существующие файлы
locate -e "*.conf" | head -20

# Создать пользовательскую базу
updatedb -l 0 -U /home/user/projects -o ~/myprojects.db
locate -d ~/myprojects.db "*.py"

Скрипты с locate

# Найти все конфиги и проверить синтаксис nginx
locate -b "*.conf" | grep nginx | while read f; do
  nginx -t -c "$f" 2>/dev/null && echo "OK: $f"
done

# Найти большие лог-файлы
locate "*.log" -e | xargs -r ls -lh 2>/dev/null \
  | sort -k5 -rh | head -10

# Найти дубликаты имён файлов в разных местах
locate -b "settings.py" | grep -v ".pyc"

Советы и предупреждения

Совет: используй -e для актуальных результатов
Флаг -e заставляет locate проверять физическое существование каждого найденного файла перед выводом. Это немного медленнее, но позволяет избежать ложных результатов для файлов, удалённых после последнего updatedb. Используй locate -e pattern в скриптах, где важна актуальность.
Совет: plocate быстрее mlocate
Современные дистрибутивы (Ubuntu 21.04+, Debian 11+, Fedora 34+) включают plocate вместо устаревшего mlocate. Утилита plocate использует более эффективный индекс и в 10-100 раз быстрее при поиске. Команда остаётся той же: locate pattern. База хранится в /var/cache/plocate/plocate.db.
Внимание: locate показывает только то, что есть в базе
База данных обновляется раз в сутки. Файлы, созданные или удалённые после последнего updatedb, не будут отражены в результатах. Для поиска актуально созданных файлов используй find. Для немедленного обновления базы — sudo updatedb (требует нескольких минут и дисковых ресурсов).
Внимание: locate и безопасность
По умолчанию locate показывает только файлы, которые пользователь имеет право читать — непривилегированный пользователь не увидит пути к файлам, доступ к которым у него нет. Однако это зависит от реализации и конфигурации. На серверах с несколькими пользователями проверь настройки PRUNE_BIND_MOUNTS и PRUNEPATHS в /etc/updatedb.conf, чтобы чувствительные пути не индексировались.