Библиотека сайта rus-linux.net
8 примеров использования команды locate в Linux
Оригинал: 8 Linux Locate Command Examples for Beginners
Автор: Himanshu Arora
Дата публикации: 20 апреля 2017 г.
Перевод: А.Панин
Дата перевода: 25 апреля 2017 г.
Хотя find, без сомнения, и является одной из наиболее популярных, а также мощных утилит с интерфейсом командной строки для поиска файлов в Linux, она не является настолько быстрой, чтобы мгновенно выводить результаты поиска. Если вам нужно найти файл в системе с помощью ее интерфейса командной строки, причем скорость поиска имеет решающее значение, вас может заинтересовать другая утилита под названием locate
.
В данной статье мы будем обсуждать методику использования команды locate, рассматривая простые для понимания примеры. Помните о том, что все инструкции и примеры, приведенные в данной статье, были протестированы в системе Ubuntu 16.04 LTS с утилитой locate версии 0.26.
1. Использование команды locate в Linux
Команда locate крайне проста в использовании. Все, что вам нужно сделать - это передать ей имя файла, который необходимо найти.
$ locate [имя-файла]
Например, если вам нужно найти все файлы в именах которых содержится строка "dir2"
, вы можете использовать locate следующим образом:
Примечание: команда locate dir2
(без звездочек) также вполне применима, ведь locate автоматически заменяет переданное имя файла (такое, как NAME
), на соответствующий шаблон (в данном случае, *NAME*
).
2. Принцип работы locate или почему поиск осуществляется так быстро
Причина, по которой утилита locate работает настолько быстро, заключается в том, что она не исследует файловую систему в поисках файла или директории с заданным именем. Вместо этого она использует информацию из базы данных (собранную утилитой updatedb) в процессе поиска элементов файловой системы с заданными именами и генерирует вывод на основе этой информации.
Хотя данный подход и имеет массу преимуществ, он не лишен недостатков. Основной его недостаток заключается в том, что после создания каждого нового файла или новой директории для корректной работы утилиты приходится обновлять информацию в базе данных. В противном случае утилита не сможет найти файлы и директории, созданные после последнего обновления информации в базе данных.
Например, если я попытаюсь найти файлы с именами, содержащими строку tosearch
в директории Downloads
, утилита find сгенерирует следующий вывод:
Но при поиске файлов с теми же именами с помощью утилиты locate не будет выведено каких-либо результатов:
Это означает, что информация в базе данных locate не была обновлена после создания интересующего меня файла. Ну что же, давайте обновим информацию в базе данных с помощью команды updatedb
. Это делается следующим образом:
$ sudo updatedb
Теперь при исполнении приведенной выше команды locate выводится информация о найденных файлах:
Аналогично, после удаления файла или директории вам придется убедиться в наличии актуальной информации в базу данных locate, ведь в противном случае информация о них будет выводиться при последующих операциях поиска.
3. Вывод информации о количестве найденных файлов и директорий
Как вы уже знаете, утилита locate выводит имена найденных файлов вместе с их полными или абсолютными путями. Но при желании вы можете сообщить ей о том, что вместо вывода данной информации нужно выводить лишь информацию о количестве найденных файлов и директорий. Для этой цели предназначен параметр -c
.
4. Вывод информации лишь о существующих в данный момент файлах
В данной статье уже говорилось о том, что при удалении файла с диска до обновления базы данных его имя будет выводиться в результатах поиска. Однако, в подобных случаях вы можете не обновлять базу данных и получать корректные результаты поиска благодаря поддержке параметра -e
.
Например, рассмотрим следующую ситуацию: я умышленно удалил файл filetosearch.txt
с диска. Этот факт был подтвержден утилитой find, которая не смогла найти его:
Но в случае осуществления аналогичной операции поиска с помощью утилиты locate информация о файле все еще выводилась:
И мы без труда можем догадаться, почему это происходит - база данных locate не была обновлена после удаления файла. Однако, в случае использования параметра -e
проблема будет решена:
На странице руководства locate данный параметр описан следующим образом: "Выводить информацию лишь о тех файлах, которые существуют в момент запуска утилиты".
5. Игнорирование регистра символов
По умолчанию утилита locate осуществляет поиск файлов с учетом регистра их имен. Но вы можете сообщить утилите о необходимости игнорирования различий в регистре символов имен файлов с помощью параметра -i
.
Например, в моей системе имеются два файла с именами newfiletosearch.txt
и NEWILETOSEARCH.txt
. Очевидно, что имена файлов отличаются лишь регистром символов. Если вы используете утилиту locate для поиска файлов по шаблону *tosearch*
, она выведет лишь вариант имени файла в нижнем регистре:
Но в случае использования параметра -i
утилита будет игнорировать регистр символов имен файлов, поэтому оба имени появятся в выводе:
6. Использование символа ASCII NUL для разделения имен файлов
По умолчанию имена файлов, выводимые утилитой locate, разделяются с помощью символа перехода на новую строку (\n
). Но при необходимости вы можете изменить этот символ, а точнее, использовать вместо него символ ASCII NUL
. Для этой цели предназначен параметр -0
.
Например, я могу выполнить команду из предыдущего раздела, добавив в нее параметр -0
:
Несложно заметить, что в выводе больше не используется символ перехода на новую строку - он был заменен на символ ASCII NUL
.
7. Вывод информации о базе данных locate
Если вам необходима информация об используемой утилитой locate базе данных, а также статистические данные, касающиеся этой базы данных, вы можете воспользоваться параметром -S
:
8. Поиск файлов с четко заданным именем
По умолчанию при поиске файла с помощью locate переданное имя, такое, как NAME
, будет автоматически преобразовываться в в шаблон поиска *NAME*
. Например, при поиске файла с именем testfile
будут выведены все имена файлов, соответствующие шаблону поиска *testfile*
:
Но что делать тогда, когда нужно искать лишь файлы с именем testfile
? Ну, вы этом случае вы можете воспользоваться регулярным выражением, которое активируется с помощью параметра -r
. Исходя из этого, вы можете найти все файлы с именами testfile
с помощью регулярного выражения аналогичным образом:
$ locate -r /testfile$
Если вы не знакомы с регулярными выражениями, рекомендую обратиться к
Заключение
Утилита locate поддерживает большое число дополнительных параметров, но тех из них, что описаны в статье, должно хватить для составления хотя бы поверхностного представления о назначении утилиты и успешного начала работы с ней. Рекомендую в первую очередь испытать самостоятельно все описанные параметры утилиты в своей системе Linux, после чего разобраться с дополнительными параметрами, описанными на
Не стесняйтесь оставлять комментарии при возникновении любых сомнений или вопросов.