[ @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