Наши партнеры

UnixForum





Библиотека сайта 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, после чего разобраться с дополнительными параметрами, описанными на странице руководства.

Не стесняйтесь оставлять комментарии при возникновении любых сомнений или вопросов.