Thank you for reading this post, don't forget to subscribe!
Одна из наиболее распространенных операций при работе в Linux – поиск файлов и каталогов. В системах Linux есть несколько команд, которые позволяют вам искать файлы, find и locate наиболее часто используемые команды.
Команда locate – самый быстрый и простой способ поиска файлов и каталогов по их именам.
В этой статье мы объясним, как использовать команду locate в Linux.
Установка команды locate (команда locate не найдена)
В зависимости от дистрибутива и от того, как была предоставлена система, пакет locate может быть или не быть предварительно установлен в вашей системе Linux.
Чтобы проверить, установлена ли утилита locate в вашей системе, откройте терминал, введите locate и нажмите Enter. Если пакет установлен, система отобразит locate: no pattern to search for specified, в противном случае вы увидите что-то вроде locate command not found.
Если locate не установлен, вы можете легко установить его с помощью менеджера пакетов вашего дистрибутива.
Установка locate на Ubuntu и Debian
1 |
sudo apt updatesudo apt install mlocate |
Установка locate на CentOS и Fedora
1 |
sudo yum install mlocate |
Синтаксис и основные опции
Синтаксис команды locate следующий:
1 |
locate [OPTION] . . . PATTERN . . . |
Утилита производит поиск файлов, имена которых совпадают с указанным в параметре PATTERN шаблоном и выводит найденные соответствия. Опции, заданные параметром OPTION, управляют специфичным поведением утилиты locate.
Опция | Значение |
-S, —statistics | Выводит статистику по используемой утилитой locate БД. |
-i, —ignore-case | Проводит поиск без учёта регистра символов в шаблоне поиска. |
-0, —null | Отключает форматирование (перевод строки для каждого совпадения) в выводе. |
-r, —regexp | Задание шаблона поиска с помощью регулярного выражения. |
-c, —count | Выводит только количество совпадений без подробной информации. |
-e, —existing | Выводит результаты только для существующих в ФС файлов и каталогов. |
Как работает locate
Команда locate выполняет поиск заданного шаблона в файле базы данных, сгенерированном командой updatedb. Найденные результаты отображаются на экране, по одному на строку.
Во время установки пакета mlocate создается задание cron, которое запускает команду updatedb каждые 24 часа. Это гарантирует, что база данных регулярно обновляется. Для получения дополнительной информации о работе cron проверьте файл /etc/cron.daily/mlocate.
Базу данных можно обновить вручную, выполнив команду updatedb от имени пользователя root или пользователя с привилегиями sudo:
1 |
sudo updatedb |
Процесс обновления займет некоторое время, в зависимости от количества файлов и каталогов и скорости вашей системы.
Файлы, созданные после обновления базы данных, не будут отображаться в результатах поиска.
По сравнению с более мощной командой find, которая выполняет поиск в файловой системе, locate работает намного быстрее, но не имеет многих функций и может выполнять поиск только по имени файла.
Как использовать команду locate
Синтаксис команды locate следующий:
1 |
locate [OPTION] PATTERN... |
В своей основной форме, когда используется без каких-либо опций, команда locate напечатает абсолютный путь ко всем файлам и каталогам, который соответствует шаблону поиска и для которого пользователь имеет разрешение на чтение.
Например, чтобы найти файл с именем .bashrc, введите:
1 |
locate .bashrc |
Вывод будет включать имена всех файлов, содержащих строку .bashrc в их именах:
1 2 3 4 5 6 |
/etc/bash.bashrc /etc/skel/.bashrc /home/andreyex/.bashrc /usr/share/base-files/dot.bashrc /usr/share/doc/adduser/examples/adduser.local.conf.examples/bash.bashrc /usr/share/doc/adduser/examples/adduser.local.conf.examples/skel/dot.bashrc |
Файл /root/.bashrc не будет показан, так как мы запустили команду как обычный пользователь, который не имеет право доступа к каталогу /root.
Если список результатов длинный, для лучшей читаемости вы можете направить вывод в команду less:
1 |
locate .bashrc | less |
Команда locate также принимает шаблоны, содержащие символы-заглушки, такие как подстановочный знак *. Когда шаблон не содержит символов-глобусов *PATTERN*, которые ищет команда, поэтому в предыдущем примере отображались все файлы, содержащие шаблон поиска в своих именах.
Подстановочный знак – это символ, используемый для обозначения нуля, одного или нескольких символов. Например, для поиска всех файлов .md в системе вы должны использовать:
1 |
locate *.md |
Чтобы ограничить результаты поиска, используйте -nпараметр, за которым следует количество результатов, которые вы хотите отобразить. Например, следующая команда будет искать все файлы .py и отображать только 10 результатов:
1 |
locate -n 10 *.py |
По умолчанию locate выполняет поиск с учетом регистра. Опция -i( –ignore-case) указывает locate на игнорирование регистра и запуск поиска без учета регистра.
1 |
locate -i readme.md |
1 2 3 |
/home/andreyex/p1/readme.md /home/andreyex/p2/README.md /home/andreyex/p3/ReadMe.md |
Чтобы отобразить количество всех совпадающих записей, используйте параметр -c( –count). Следующая команда вернет номер всех файлов, содержащихся .bashrc в их именах:
1 |
locate -c .bashrc |
1 |
6 |
По умолчанию locate не проверяет, существуют ли найденные файлы в файловой системе. Если вы удалили файл после последнего обновления базы данных, если файл соответствует шаблону поиска, он будет включен в результаты поиска.
Чтобы отобразить только имена файлов, которые существуют в данный момент, в locate используйте параметр -e( –existing). Например, следующее вернет только существующие файлы .json:
1 |
locate -e *.json |
Если вам нужно выполнить более сложный поиск, вы можете использовать опцию -r( –regexp), которая позволяет выполнять поиск, используя базовое регулярное выражение вместо шаблонов. Эта опция может быть указана несколько раз.
Например, для поиска всех файлов .mp4 и .avi в вашей системе и игнорирования регистра вы должны выполнить:
1 |
locate --regex -i "(\.mp4|\.avi)" |
Команда locate в примерах
Для того, чтобы исключить выдачу утилитой locate недостоверных результатов, необходимо следить за тем, чтобы БД находилась в актуальном состоянии. Это позволяет команда:
1 |
$ sudo updatedb |
Теперь можно рассмотреть основные приёмы использования утилиты locate для самых распространённых случаев.
Получение информации о состоянии БД
Когда нужно узнать, какая БД используется для индексирования файлов, используемая утилитой locate, а также некоторые её статистические показатели, следует выполнить команду:
1 2 3 4 5 6 |
$ locate -S База данных /var/lib/mlocate/mlocate.db 96 661 папка 1 370 352 файла 111 090 987 байт в названии файла база данных заняла 39 159 149 байт |
Вывод информации о количестве найденных совпадений
По-умолчанию утилита locate выводит найденные файлы вместе с их абсолютными путями в ФС. Но в некоторых ситуациях необходимо просто узнать, как часто в системе встречается тот или иной файл, без лишней информации. Можно просто вывести данные о количестве требуемых файлов, которые имеются в системе. Для этого служит опция «-c»:
1 2 |
$ locate -c “*kde*” 17012 |
Запись “*kde*” означает, что будут искаться все файлы, в имени которых встречается подстрока «kde».
Вывод только актуальных результатов
Поскольку достоверность результатов поиска утилиты locate зависит от актуальности БД, то необходимо эту БД своевременно обновлять. Однако, есть возможность этого не делать, а воспользоваться опцией «-e», которая позволяет производить поиск, сверяя результаты с реальной структурой ФС. Но в данном случае по понятным причинам скорость поиска будет снижена:
1 2 3 4 5 6 7 8 9 |
$ 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»:
1 2 3 4 5 6 7 8 9 10 |
$ 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»:
1 2 3 |
$ locate -i -r \locate.txt$ /home/john/documents/LOCATE.TXT /home/john/documents/locate.txt |
Другой возможностью утилиты locate является замена символа перевода строки при выводе результатов поиска. По-умолчанию, каждое совпадение отображается в новой строке. Если необходимо, чтобы вывод был неформатированным, то можно использовать опцию «-0». Она позволяет выводить результаты в самом «чистом» виде, без использования переводов строк:
1 2 |
$ locate -i -r \locate.txt$ /home/john/documents/LOCATE.TXT/home/john/documents/locate.txt |
Заключение
Команда locate ищет в файловой системе файлы и каталоги, чье имя соответствует заданному шаблону. Синтаксис команды легко запомнить, а результаты отображаются практически мгновенно.
Для получения дополнительной информации обо всех доступных опциях команды locate, наберите man locate в вашем терминале.