Поиск файлов в Linux при помощи команды locate

Источник: rus-linux
А.Панин

Оригинал: Find files on Linux with the command locate 
Автор: Riccardo Capecchi 
Дата публикации: 12 июля 2012 г. 
Перевод: А.Панин 
Дата публикаци перевода: 18 октября 2012 г.

Только что я понял, что я ни разу не писал об одной из моих любимых программ, используемых в командной оболочке Linux: locate.

Эта программа принимает в качестве параметра имя файла (или часть имени) и моментально выводит список путей до этого файла в файловой системе; альтернативой этой программе является find, но разница между ними заключается в том, что find производит поиск по файловой системе и требуется значительный период времени для получения результата, а отличие в работе этих программ состоит в том, что locate использует собственную базу данных для хранения имен файлов в то время, как find исследует директории в поисках заданного параметром командной строки имени файла.

База данных locate mlocate.db

Для получения результатов, соответствующих действительности, вам необходимо поддерживать в обновленном состоянии базу данных со списком имен файлов. Операционная система может быть настроена таким образом, что обновление будет выполняться автоматически как задача cron. Например, в моей операционной системе Ubuntu 12.04 эта задача описана в файле /etc/cron.daily/mlocate и выполняется ежедневно.

Если в вашем дистрибутиве обновление по умолчанию отключено, можно обновить базу данных вручную при помощи команды sudo updatedb (требуются права пользователя root); это очень удобно в том случае, когда вы только что установили пакеты с программным обеспечением и хотите найти какой-либо файл, так как время, уходящее на обновление базы данных при помощи updatedb, всегда меньше времени на поиск файлов по всей файловой системе при помощи find.

Обычно база данных расположена в

/var/lib/mlocate/mlocate.db

и вы можете контролировать то, какие файлы и файловые системы будут исследованы при обновлении базы данных с помощью файла конфигурации, расположенного в

/etc/updatedb.conf

Ниже приведено содержимое файла конфигурации в моей системе:

PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ecryptfs fusesmb devtmpfs"

В том случае, если директории подпадают под критерии, приведенные в качестве параметров переменных PRUNEFSPRUNENAMES или PRUNEPATHSupdatedb не производит исследование содержимого этой директории. Тем не менее, сама директория добавляется в базу данных. Ниже приведено подробное описание параметров, которые можно использовать в этом файле:

  • PRUNEFS: Разделенный пробелами список типов файловых систем (используются те же типы, что и в файле /etc/mtab), которые не должны исследоваться при помощи updatedb. Названия типов файловых систем не зависят от регистра. По умолчанию никакие из типов файловых не пропускаются. В том случае, если файловая система не исследуется, все файловые системы, смонтированные в рамках этой файловой системы, также не исследуются даже в том случае, когда их тип не задан в параметре PRUNEFS.
  • PRUNENAMES: Разделенный пробелами список имен директорий (без путей), которые не должны быть исследованы при помощи updatedb. По умолчанию никакие из имен директорий не пропускаются. Следует отметить, что может задаваться полное имя директории без применения какого-либо механизма шаблонов (например, механизма glob).
  • PRUNEPATHS: Разделенный пробелами список путей, которые не должны исследоваться при помощи updatedb. Каждый путь должен быть задан в точно таком же формате, как и вывод locate. По умолчанию никакие из путей не пропускаются.
  • PRUNE_BIND_MOUNTS: В качестве параметров могут быть использованы значения: 0, no, 1 или yes. Если значениями переменной PRUNE_BIND_MOUNTS являются параметры 1 или yes, файловые системы, смонтированные в режиме bind не исследуются при помощи updatedb. Все файловые системы, смонтированные в рамках пропускаемой файловой системы, также пропускаются даже тогда, когда они смонтированы не в режиме bind. По умолчанию файловые системы, смонтированные в режиме bind, не пропускаются.

Использование locate

Теперь, когда мы настроили и обновили базу данных, мы можем начать использовать команду locate (в рамках обычной пользовательской учетной записи или учетной записи пользователя root - на ваше усмотрение); ниже приведено несколько примеров использования:

Типичный пример использования - поиск файла

$ locate php.ini

Эта команда должна вывести список путей, по которым вы можете обнаружить файлы с названием php.ini. Вывод должен быть аналогичен представленному ниже:

/etc/php5/cgi/php.ini
/etc/php5/cli/php.ini
/etc/php5/fpm/php.ini
/usr/share/doc/php5-common/examples/php.ini-development
/usr/share/php5/php.ini-production
/usr/share/php5/php.ini-production.cli

Это очень полезная команда в том случае, когда вам нужно внести изменения в файл конфигурации php, но вы не можете вспомнить, где расположен файл php.ini.

Скрытие сообщений об ошибках

Вы можете использовать параметр -q для скрытия сообщений об ошибках. Сообщения об ошибках обычно информируют пользователя о том, что нет доступа к файлу ввиду того, что пользователь работает в рамках обычной учетной записи (не записи суперпользователя). Параметр -q позволяет скрыть также и любые другие сообщения об ошибках:

$ locate .php -q

Ограничение вывода

Вы можете использовать параметр -n для ограничения количества возвращаемых результатов поиска заданным количеством строк. Таким образом, вы можете запросить только 10 результатов поиска при помощи следующей команды:

$ locate .php -n 10

В результате будут выведены первые 10 файлов с расширением .php.

Подсчет количества результатов поиска

Вы можете использовать параметр -c для того, чтобы просто узнать количество файлов, соответствующих заданному прототипу поиска, а в данном случае я провожу подсчет файлов с расширением .php:

$ locate .php -c
3414

Независимый от регистра поиск

Вы можете использовать параметр -i в том случае, когда вам необходимо провести писк файлов без учета регистра. Команда для поиска файлов без учета регистра:

$ locate INDEX.php -i

В этом случае будут подходить следующие имена файлов:

index.php INDEX.PHP Index.Php

Информация о базе данных

В качестве последнего рассматриваемого параметра стоит упомянуть параметр --statistics, предназначенный для получения информации о базе данных; вместо поиска будет выведена статистика, относящаяся к базе данных mlocate.db.

$ locate --statistics
Database /var/lib/mlocate/mlocate.db:
        6146 directories
        57770 files
        3564748 bytes in file names
        1612746 bytes used to store database

Заключение

Эта команда помогала мне множество раз в различных ситуациях, поэтому она установлена на каждом сервере или настольном компьютере, который я использую. Я не стал включать раздел об установке программы в эту короткую статью по той причине, что locate доступна в любом дистрибутиве Linux, обычно в пакете с названием mlocate, поэтому вы можете использовать ваш менеджер пакетов для ее установки, и еще я уверен, что вы полюбите ее.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=31192