Поиск файлов — одна из наиболее распространённых задач при работе в операционных системах (ОС) и их администрировании. В Linux существуют разные инструменты поиска и самым популярным и универсальным является команда find. Однако, данная команда работает не так быстро, как этого хотелось бы в случае с обработкой больших объёмов данных. Гораздо более быстрой альтернативой для поиска файлов в Linux является утилита locate. Об особенностях её работы и использования будет рассказано в данной статье.
Синтаксис и основные опции
Синтаксис команды locate следующий:
locate [OPTION] . . . PATTERN . . .
Утилита производит поиск файлов, имена которых совпадают с указанным в параметре PATTERN шаблоном и выводит найденные соответствия. Опции, заданные параметром OPTION, управляют специфичным поведением утилиты locate.
Опция | Значение |
-S, —statistics | Выводит статистику по используемой утилитой locate БД. |
-i, —ignore-case | Проводит поиск без учёта регистра символов в шаблоне поиска. |
-0, —null | Отключает форматирование (перевод строки для каждого совпадения) в выводе. |
-r, —regexp | Задание шаблона поиска с помощью регулярного выражения. |
-c, —count | Выводит только количество совпадений без подробной информации. |
-e, —existing | Выводит результаты только для существующих в ФС файлов и каталогов. |
Особенности работы команды locate
Скорость, с которой работает утилита locate сразу же бросается в глаза — поиск действительно, практически моментальный. Это возможно благодаря тому, что locate во время своей работы не производит сканирование файловой системы (ФС) непосредственно. Она анализирует информацию из базы данных (БД), которая формируется другой утилитой — updatedb. Вывод результатов утилиты locate – это результат анализа информации из БД, а не просмотра каталогов и файлов.
Скорость — это главное преимущество утилиты locate. Однако, оно же влечёт за собой и главный её недостаток — достоверность результатов поиска. Дело в том, что после появления в ФС новых элементов (файлов и каталогов), информация в БД должна быть обновлена утилитой updatedb и на это требуется определённое время. Если новые файлы и каталоги по каким-то причинам не были ещё проиндексированы в БД, то утилита locate их не сможет обнаружить. Таким же образом БД должна обновляться и при удалении из ФС каких-либо файлов и каталогов. Это необходимо учитывать.
Команда locate в примерах
Для того, чтобы исключить выдачу утилитой locate недостоверных результатов, необходимо следить за тем, чтобы БД находилась в актуальном состоянии. Это позволяет команда:
$ sudo updatedb
Теперь можно рассмотреть основные приёмы использования утилиты locate для самых распространённых случаев.
Получение информации о состоянии БД
Когда нужно узнать, какая БД используется для индексирования файлов, используемая утилитой locate, а также некоторые её статистические показатели, следует выполнить команду:
$ locate -S База данных /var/lib/mlocate/mlocate.db 96 661 папка 1 370 352 файла 111 090 987 байт в названии файла база данных заняла 39 159 149 байт
Вывод информации о количестве найденных совпадений
По-умолчанию утилита locate выводит найденные файлы вместе с их абсолютными путями в ФС. Но в некоторых ситуациях необходимо просто узнать, как часто в системе встречается тот или иной файл, без лишней информации. Можно просто вывести данные о количестве требуемых файлов, которые имеются в системе. Для этого служит опция «-c»:
$ locate -c “*kde*” 17012
Запись “*kde*” означает, что будут искаться все файлы, в имени которых встречается подстрока «kde».
Вывод только актуальных результатов
Поскольку достоверность результатов поиска утилиты locate зависит от актуальности БД, то необходимо эту БД своевременно обновлять. Однако, есть возможность этого не делать, а воспользоваться опцией «-e», которая позволяет производить поиск, сверяя результаты с реальной структурой ФС. Но в данном случае по понятным причинам скорость поиска будет снижена:
$ locate -e "*notebook.cpp*" /home/john/Builds/wxWidgets-3.0.4/samples/notebook/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/samples/widgets/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/src/generic/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/src/gtk/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/src/gtk1/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/src/msw/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/src/os2/notebook.cpp /home/john/Builds/wxWidgets-3.0.4/src/univ/notebook.cpp
Вывод результатов с точными совпадениями
До этого в вышеприведённых примерах рассматривались «нечёткие» совпадения. Но утилита locate позволяет производить поиск, учитывающий точно заданные запросы. Например нужно найти каталоги и файлы, имя которых точно соответствует «notebook»:
$ locate -r \notebook$ /home/john/Builds/codelite-12.0/LiteEditor/res/notebook /home/john/Builds/codelite-12.0/sdk/wxflatnotebook /home/john/Builds/wxWidgets-3.0.4/gtk-build/samples/notebook /home/john/Builds/wxWidgets-3.0.4/gtk3-build/samples/notebook /home/john/Builds/wxWidgets-3.0.4/samples/notebook /home/john/Builds/wxWidgets-3.0.4/samples/notebook/notebook /usr/share/akonadi/firstrun/defaultnotebook /usr/share/themes/Breeze/gtk-2.0/widgets/notebook /usr/share/themes/Breeze-Dark/gtk-2.0/widgets/notebook
В данном случае опция -r активирует использование регулярного выражения для задания шаблона поиска. Само выражение заключается между символами ‘\’ и ‘$’.
Другие полезные функции
Среди прочих возможностей утилиты locate наиболее полезной является игнорирование регистра символов в поисковом шаблоне. По-умолчанию утилитой locate поиск производится с учётом регистра символов. Но если в системе имеются два файла с именами locate.txt и LOCATE.TXT, то для того, чтобы исключить зависимость поиска от регистра символов, нужно использовать опцию «-i»:
$ locate -i -r \locate.txt$ /home/john/documents/LOCATE.TXT /home/john/documents/locate.txt
Другой возможностью утилиты locate является замена символа перевода строки при выводе результатов поиска. По-умолчанию, каждое совпадение отображается в новой строке. Если необходимо, чтобы вывод был неформатированным, то можно использовать опцию «-0». Она позволяет выводить результаты в самом «чистом» виде, без использования переводов строк:
$ locate -i -r \locate.txt$ /home/john/documents/LOCATE.TXT/home/john/documents/locate.txt
Заключение
В заключение необходимо отметить, что утилита locate – это достаточно гибкий инструмент для поиска файлов. Да ещё и обладает впечатляющей скоростью работы. Представленные в данной статье основные опции и примеры позволяют производить довольно продвинутый поиск файлов в системе. Для получения дополнительных возможностей при использовании рассмотренной утилиты следует обращаться к официальному руководству с помощью команды man locate.