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 покрывает большинство задач поиска в системе.
Синтаксис
- PATTERN — подстрока или glob-паттерн для поиска в путях файлов. По умолчанию регистронезависимый поиск подстроки
- -r REGEXP — искать по регулярному выражению (POSIX ERE)
- Несколько PATTERN объединяются по И (AND) — файл должен соответствовать всем паттернам
- Без wildcards PATTERN ищется как подстрока в полном пути; с wildcards — как glob
Обновление базы данных
Флаги и опции
| Флаг | Описание |
|---|---|
-i | Case insensitive: игнорировать регистр при поиске. По умолчанию locate уже нечувствителен к регистру (в большинстве конфигураций), но -i гарантирует это явно |
-r REGEXP | Regex: искать по регулярному выражению вместо шаблона glob. Используется POSIX ERE (extended regex) |
-c | Count: вывести только количество найденных совпадений, без самих путей |
-l N | Limit: вывести не более N результатов. Полезно для больших выборок: locate -l 10 pattern |
-n N | Limit (синоним -l в некоторых версиях): ограничить количество результатов числом N |
-e | Existing: проверять существование каждого найденного файла перед выводом. Устраняет «мертвые» записи о удалённых файлах (медленнее) |
-w | Whole path: совпадение должно быть со всем путём целиком, а не подстрокой |
-b | Basename: искать только в имени файла (без директорий), а не в полном пути. Пример: locate -b sshd_config |
-S | Statistics: показать статистику базы данных — количество директорий, файлов, размер БД |
-d DB | Database: использовать указанный файл базы данных вместо системного. Полезно для пользовательских баз |
-0 | Null: разделять результаты нулевым байтом вместо новой строки. Для безопасной передачи через пайп в xargs -0 |
-A | All 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 заставляет locate проверять физическое существование каждого найденного файла перед выводом. Это немного медленнее, но позволяет избежать ложных результатов для файлов, удалённых после последнего updatedb. Используй locate -e pattern в скриптах, где важна актуальность.
Современные дистрибутивы (Ubuntu 21.04+, Debian 11+, Fedora 34+) включают
plocate вместо устаревшего mlocate. Утилита plocate использует более эффективный индекс и в 10-100 раз быстрее при поиске. Команда остаётся той же: locate pattern. База хранится в /var/cache/plocate/plocate.db.
База данных обновляется раз в сутки. Файлы, созданные или удалённые после последнего
updatedb, не будут отражены в результатах. Для поиска актуально созданных файлов используй find. Для немедленного обновления базы — sudo updatedb (требует нескольких минут и дисковых ресурсов).
По умолчанию
locate показывает только файлы, которые пользователь имеет право читать — непривилегированный пользователь не увидит пути к файлам, доступ к которым у него нет. Однако это зависит от реализации и конфигурации. На серверах с несколькими пользователями проверь настройки PRUNE_BIND_MOUNTS и PRUNEPATHS в /etc/updatedb.conf, чтобы чувствительные пути не индексировались.