Хотя 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, после чего разобраться с дополнительными параметрами, описанными на странице руководства.
Не стесняйтесь оставлять комментарии при возникновении любых сомнений или вопросов.
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
Волк слабее льва и тигра, но в цирке волк не выступает!
Волк - единственный из зверей, который может пойти в бой на более сильного противника.
Если же он проиграл бой, то до последнего вздоха смотрит в глаза противника. После этого умирает...
Администратор сайта laptop.ucoz.ru не несет ответственности за содержание рекламных объявлений. Все используемые на сайте зарегистрированные товарные знаки принадлежат своим законным владельцам! Используемая со сторонних источников информация публикуется с обязательными ссылками на эти источники.