Всем привет!
Когда нужно найти файлы в системе Linux, обычно используется команда find. find хорошая программа, но медленная.
На помощь может прийти команда locate. locate ищет файлы очень быстро, в чем собственно вы убедитесь прочитав эту статью.
В этой статье объясняется все, что может вам пригодиться для использования команды locate.
Как работает команда locate? – updatedb & updatedb.conf
Выше я сказал, что команда locate работает очень быстро, тогда первый вопрос который приходит в голову – Почему?
Команда locate не ищет файлы на диске, а выполняет поиск путей файлов в базе данных. База данный это файл, в котором содержится информация о файлах и их путях в системе Linux. Файл базы данных находится в:
Код:
|
/var/lib/mlocate/mlocate.db |
Есть утилита под названием
updatedb, которая сканирует всю систему и обновляет файл базы данных
mlocate.db.
Команда
locate зависит от базы данных, которая может быть обновлена через команду
updatedb. Поэтому, чтобы получать последние и достоверные результаты по команде
locate, нужно обновлять базу данных на регулярной основе.
Мы можем настроить команду updatedb так, как нам нужно. Для этого нужно обновить файл
updatedc.conf. Это конфигурационный файл, который “читает” команда updatedb перед обновлением базы данных. Файл updatedb.conf находится в директории /etc:
Код:
|
# cat /etc/updatedb.conf
PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media"
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" |
Файл updatedb.conf содержит информацию в виде
ПЕРЕМЕННЫЕ=
ЗНАЧЕНИЯ. Эти переменные могут классифицироваться на:
- PRUNEFS – здесь содержится список файловых систем, которые не должны сканироваться при работе программы updatedb
- PRUNENAMES – содержится список имен директорий, без путей (path), которые не должны сканироваться при работе программы updatedb
- PRUNEPATHS – здесь содержатся названия путей (path) директорий, которые не должны сканироваться при работе программы updatedb
- PRUNE_BIND_MOUNTS – в этой переменной содержится одно из значений 0, no, 1 или yes.
Для справки: чтобы отключить updatedb, для этого нужно добавить в список исключенных директорий “PRUNEPATHS” корневую директорию “/“.
Примеры команды locate
1. Ищем файлы используя locate
Чтобы найти конкретные (определенные) файлы в системе, воспользуйтесь следующей командой:
Код:
|
$ locate sysctl.conf
/etc/sysctl.conf
/usr/share/doc/procps/examples/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz |
Следующая команда ищет файл httpd.conf по всей системе:
Код:
|
$ locate httpd.conf
/opt/lampp/etc/httpd.conf
/opt/lampp/etc/httpd.conf.bak
/opt/lampp/etc/original/httpd.conf |
Можно использовать команду locate с параметром -0, чтобы вывести все пути файлов в одну строку. Например:
Код:
|
$ locate -0 httpd.conf
/opt/lampp/etc/httpd.conf/opt/lampp/etc/httpd.conf.bak/opt/lampp/etc/original/httpd.conf |
2. Отображать только количество найденных файлов
Чтобы в выводе отобразить только количество найденных файлов, используйте команду locate -c, как показано ниже:
Код:
|
$ locate -c httpd.conf
3 |
3. Используйте updatedb для обновления базы данных mlocate
Предположим, что вы сделали копию какого то исполняемого или системного файла:
Код:
|
# cd /etc
# cp sysctl.conf sysctl.conf.copy |
Если вы попробуйте найти файл sysctl.conf используя locate, то вы не найдете файл sysctl.conf.copy:
Код:
|
# locate sysctl.conf
/etc/sysctl.conf
/usr/share/doc/procps/examples/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz |
Причина в том, что когда мы создали файл sysctl.conf.copy, база данных на тот момент не была обновлена. Давайте теперь обновим базу данных используя updatedb и снова воспользуемся командой locate:
Код:
|
$ updatedb
updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db' |
Важно помнить, что команда updatedb требует запуск с правами root:
Для справки: не забывайте, что когда стоит значок доллара $, значит вы работайте от обычного пользователя. Если стоит знак решетки #, значит вы работайте с правами суперпользователя root.
Если запустить команду locate после updatedb,
Код:
|
# locate sysctl.conf
/etc/sysctl.conf
/etc/sysctl.conf.copy
/usr/share/doc/procps/examples/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz |
4. Изменяем расположение базы данных mlocate
По умолчанию база данных, которую читает утилита locate, находится в /var/lib/mlocate/mlocate.db. Но если вы захотите привязать команду locate к другой базе данных, которая имеет иное расположение, тогда воспользуйтесь опцией -d. Например:
Код:
|
$ locate -d <новый_путь_к_БД> <имя_файла> |
Важно знать, что путь к базе данных можно взять из стандартного вывода
STDIN.
5. Проверка наличия файла
Теперь представьте, что файл sysctl.conf.copy, который мы создали в 3-м пункте удален. И если опять воспользоваться командой locate, то этот файл будет найден:
Код:
|
# cd /etc
# rm sysctl.conf.orig
# locate sysctl.conf
/etc/sysctl.conf
/etc/sysctl.conf.copy
/usr/share/doc/procps/examples/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz |
Как вы видите команда locate нашла удаленный файл. Этот результат вводит в заблуждение.
Конечно можно снова воспользоваться командой updatedb, после чего запустить locate. Тогда поиска результат будет правильный.
Но лучше воспользоваться командой locate с параметром -e. Тогда будут отображены файлы, которые существуют в системе. Т.е. даже тогда когда запись о файле находится в mlocate.db, все равно будет осуществлена проверка физического нахождения файла в системе Linux, перед выводом команды locate.
Код:
|
# locate -e sysctl.conf
/etc/sysctl.conf
/usr/share/doc/procps/examples/sysctl.conf
/usr/share/man/man5/sysctl.conf.5.gz |
6. Игнорировать регистр букв в выводе locate
The locate command by default is configured to accept the file name in a case sensitive manner. In order to make the results case insensitive, we can use the -i option :
Для примера создадим два файла в нижнем и верхнем регистрах:
Код:
|
# cd /tmp
# touch testing.txt TESTING.txt
# ls
testing.txt TESTING.txt
# updatedb |
Если вы используйте команду locate в нижнем регистре, тогда будут искаться файлы только нижнего регистра:
Код:
|
# locate test.txt
/tmp/test.txt |
Используйте locate -i, чтобы отключить регистр. В данном случае будут найдены файлы обоих регистров:
Код:
|
$ locate -i testing.txt
/tmp/TESTING.txt
/tmp/testing.txt |
7. Ограничить вывод команды locate
В следующем примере вывод команды locate будет отображен в виде большого списка:
Код:
|
$ locate passwd
/etc/passwd
/etc/passwd-
/etc/cron.daily/passwd
/etc/exim4/passwd.client
/etc/pam.d/chpasswd
/etc/pam.d/passwd
/etc/security/opasswd
/opt/lampp/bin/htpasswd
/opt/lampp/bin/ldappasswd
/opt/lampp/lib/php/.registry/file_passwd.reg
/opt/lampp/lib/php/.registry/file_smbpasswd.reg
/opt/lampp/phpmyadmin/themes/original/img/s_passwd.png
/opt/lampp/phpmyadmin/themes/pmahomme/img/s_passwd.png
/usr/bin/gpasswd
/usr/bin/grub-mkpasswd-pbkdf2
/usr/bin/kdepasswd
/usr/bin/lppasswd
/usr/bin/mkpasswd
... |
Если вы хотите, чтобы отображалось определенное количество записей. Тогда воспользуйтесь утилитой locate с опцией -l и укажите сколько найденных записей вы хотите посмотреть. Например, для отображения 5-ти записей воспользуйтесь следующей командой:
Код:
|
$ locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/cron.daily/passwd
/etc/exim4/passwd.client
/etc/pam.d/chpasswd |
На сегодня все. Чтобы следить за статьями блога, оформляйте подписку по
E-MAIL или
RSS.
Источник: www.levinkv.ru