[ Пред. ] [ Содержание ] [ След. ]

locate

[ @debian @files @search ]



Мощная утилита для поиска файлов (но не их содержимого). Нужна для Krusader, но вполне может использоваться отдельно.


Поиск файлов через locate работает быстро именно потому, что это поиск по базе, а не по дискам IRL. То есть, вполне вероятно, что файлы могут быть в базе, но уже отсутствовать на диске или быть переименованными.


Работает как краулер, раз в сутки по крону — файл /etc/cron.daily/locate — запускает поиск по файлам и сохраняет информацию в свою базу данных.


Настройки БД


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


Временная настройка


Запустить updatedb с параметром PRUNEPATHS, который указывает каталоги, которые нужно исключить из индексации:


sudo updatedb --output=/var/lib/mlocate/mlocate.db --localpaths='/media/storage' --prunepaths='/'


Здесь:


--output указывает, куда сохранить базу данных (обычно это /var/lib/mlocate/mlocate.db).
--localpaths='/media/storage' ограничивает индексацию только этим каталогом.
--prunepaths='/' исключает все остальные корневые каталоги из индексации.


Постоянная настройка


1)
Или отредактировать файл крон-службы locate


sudo mcedit /etc/cron.daily/locate


и там настроить, что и как надо:


# Global options for invocations of find(1)
FINDOPTIONS='-ignore_readdir_race'
# filesystems which are pruned from updatedb database
PRUNEFS="NFS nfs nfs4 afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf ocfs2"
# paths which are pruned from updatedb database
PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /amd /alex /var/spool /sfs /media /var/lib/schroot/mount"
# netpaths which are added
NETPATHS=""
# run find as this user
LOCALUSER="nobody"
# cron.daily/find: run at this priority -- higher number means lower priority
# (this is relative to the default which cron sets, which is usually +5)
NICE=10


2)
Или отредактировать файл конфигурации (по-умолчанию пустой):


sudo mcedit /etc/updatedb.conf


В него надо добавить инструкции, которые могут быть идентичны тем, что в крон-файле (которые можно заглушить):


# Указываем юзера, из-под которого работает find. По-умолчанию указан юзер "nobody" в Linux — это стандартный системный пользователь
# с минимальными правами доступа, обычно используемый для запуска процессов, которым не требуется доступ к чувствительным данным.
# Это важно в ситуациях, когда нужно выполнить поиск в безопасном режиме, избегая доступа к файлам, требующим привилегий администратора или других пользователей.
LOCALUSER="astenix"


# cron.daily/find: run at this priority -- higher number means lower priority
# По-умолчанию приоритет процесса "5". Уровень "10" снижает нагрузку и не мешает другим процессам. Для работы в фоновом режиме
# лучше поставить уровень "10".
NICE=10


# Заставляем find ингорировать ошибки, которые могут возникнуть из-за изменений в файловой системе во время работы find.
# Такое бывает, когда find работает, а одновременно с этим на HDD происходит изменение или перемещение файлов.
FINDOPTIONS='-ignore_readdir_race'


# Проигнорировать следующие файловые системы
PRUNEFS="NFS nfs nfs4 afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf ocfs2"


# Исключить из поиска следующие пути (все системные каталоги и ряд пользовательских)
PRUNEPATHS="/home/LaTeX /home/mySettings /home/nas /bin /boot /dev /etc /lib /lib64 /lost+found /media /mnt /opt /proc /root /run /srv /sys /tmp /usr /var"


# Добавить следующие удалённые каталоги (при необходимости)
NETPATHS=""


Такие настройки указывают locate (регулярно) индексировать только файлы из-под каталога /home/


Инструкции в файле /etc/cron.daily/locate в этом случае должны быть проигнорированы, но лучше их явно заглушить.


Также есть смысл добавить в свой профиль алиас для locate — Common:HowTo:Сделать:alias


alias locate='locate -i'


Обновить базу данных


sudo updatedb


В системе может быть нескольких баз данных locate. По-умолчанию есть только одна и она находится в /var/cache/locate/locatedb


locate -S


Если есть сомнения, можно обновлять базу явно указывая её имя:


sudo updatedb --output=/var/cache/locate/locatedb


Можно занести эту инструкцию в файл с алиасами.


Поиск файлов


locate abc.txt


locate *.txt


Поиск без учета регистра буква


locate -i abc.txt


Искать только среди существующих файлов


Этот параметр заставляет locate сперва проверить, есть ли на диске каждый файл, который должен быть показан в результатах поиска. То есть, условно превращаем locate в find. Но нагрузка на процессор всё равно будет меньше, чем при явном использовании find.


locate -e *.txt


Посчитать количество найденных файлов


Выводит только число.


locate -c abc.txt


Поиск по частичному совпадению


Так locate работает по-умолчанию.


locate reach


выведет всё, что содержит ’reach’ внутри, например, ’reacher’ или ’preacher’.


Искать только указанные символы


Надо найти файлы из сериала 'Reacher'. Но на диске полно аудиофайлов из Pulp Fiction «Son of a preacher man», а поиск по «reacher» выводит ВСЕ файлы, в названии которых есть этам комбинация символов.


Решение:


locate reacher | grep -iw 'reacher'


Поисковые слова можно комбинировать. Вот этот запрос показал мне набор книг про Ричера (книги в англ.):


locate fiction | grep -iw 'reacher'


Ограничить вывод списка найденных файлов


Пролистывать экраны с результатами поиска:


locate abc.txt | less


Просто вывести на экран 10 строк:


locate -n 10 *.txt


Комплесный поиск через регулярные выражения


Делается через --regex.


Найти все файлы с расширением .mp4 А ТАКЖЕ .avi:


locate --regex -i "(\.mp4|\.avi)"


Принудительное обновление БД locate


sudo updatedb