Я пытаюсь протестировать версию locate
команды GNU. Во-первых, мне нужно создать базу данных следующим образом:
sudo gupdatedb --prunepaths=/Volumes --output=$HOME/locatedb_gupdatedb
К сожалению, через 1 минуту после запуска команды я все еще получаю следующую ошибку:
gfind: failed to read file names from file system at or below '/': No such file or directory
Я не понимаю, откуда может появиться эта ошибка?
ОБНОВЛЕНИЕ 1: я заменил gfind
запятую find
и правильный путь к find
которой /usr/bin/
. К сожалению, я получаю такие смущающие сообщения об ошибках, когда запускаю команду gupdatedb
следующим образом:
sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /Volumes /System' --output=$HOME/locatedb_gupdatedb
Здесь сообщения об ошибках:
find: /System/Volumes/Data/.Spotlight-V100: No such file or directory
find: /System/Volumes/Data/.PKInstallSandboxManager: No such file or directory
find: /System/Volumes/Data/.PKInstallSandboxManager-SystemSoftware: No such file or directory
find: /System/Volumes/Data/.cleverfiles: No such file or directory
find: /System/Volumes/Data/mnt: No such file or directory
find: /System/Volumes/Data/.DocumentRevisions-V100: No such file or directory
etc ...
Я попытался изменить в /usr/local/Cellar/findutils/4.7.0/libexec/bin/gupdatedb
файл вариант:
: ${FINDOPTIONS="2 > /dev/null"}
Но проблема в том, что этот параметр установлен перед командой find
, а не в конце, поэтому он неверен в следующем файле.
find
Учитывая тот факт , что в скрипте много команд, я не могу каждый раз вручную добавлять 2 > /dev/null
опцию терминала.
Кто-нибудь мог увидеть, как подавить все эти сообщения об ошибках из find
команды, когда я запускаю gupdatedb
команду?
ОБНОВЛЕНИЕ 2: мне наконец удалось создать базу данных с помощью gupdatedb (версия GNU updatedb
команды MacOS), выполнив:
sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /System /Volumes' --output=$HOME/locatedb_gupdatedb
Теперь проблема в том, что когда я провожу исследование подстроки файла или каталога, информация, кажется, дублируется в результатах ( sub_string
это просто часть имени файла или каталога):
Например, если я делаю:glocate -d ~/locatedb_gupdatedb sub_string
Затем у меня есть дубликаты результатов, например:
/System/Volumes/Data/Users/fab/sub_string.dat
/Users/fab/sub_string.dat
Я не знаю, как исключить ' /System/Volumes/Data/
' из этих результатов: однако я правильно указал в --prunepaths
опции каталог System
, почему он не учитывается в базе данных, созданной gupdatedb
?
Или, может быть, я должен выполнить:
sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /System/Volumes/Data /Volumes' --output=$HOME/locatedb_gupdatedb
??
Любая помощь приветствуется, чтобы исключить этот каталог
/System/Volumes/Data
из базы данных индексации.
ОБНОВЛЕНИЕ 3: Вот пример быстрого создания базы данных с расширением updatedb on Debian 10 Buster
. Между отметками времени двух команд было сделано несколько модификаций обычного использованияupdatedb
.
Итак, я пришел к выводу, что действительно существует разница между реализацией GNU/MacOS и GNU/Linux.
Любое объяснение приветствуется.
Проблема здесь в том, что вы используете GNU updatedb
с macOS find
. gupdatedb
— это сценарий оболочки, который должен запускать GNU-совместимый файл find
. В частности, он преобразуется --prunepaths
в базовое регулярное выражение, совместимое с GNU.
--prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /Volumes /System'
превращается в
PRUNEREGEX="\(^/private/tmp$\)\|\(^/private/var/folders$\)\|\(^/private/var/tmp$\)\|\(^*/Backups.backupdb$\)\|\(^/System$\)\|\(^/Volumes$\)"
GNU BRE (базовые регулярные выражения) рассматриваются \|
как «альтернативный» оператор:
'foo\|bar' соответствует либо 'foo', либо 'bar'
Это расширение GNU для синтаксиса BRE, и find
оператор macOS его не принимает. Таким образом, вся строка обрезки ничему не соответствует.
В macOS (и POSIX) BRE нет альтернативного оператора, поэтому это не очень простое решение. Сценарий updatedb для macOS преобразует альтернативу в явные -or
операторы в find
команде. Вы можете изменить сценарий GNU, чтобы сделать это. Или приступайте gfind
к работе.
Кстати, скрипт GNU updatedb создает совершенно новую базу данных с нуля при каждом запуске, как и в macOS.
Ваша установка Debian использует mlocate , который является совершенно другой реализацией, чем GNU locate, не так широко перенесен и недоступен в macOS, насколько мне известно. И хотя mlocate
на вашей установке Debian он работает быстро, это не значит, что он работает намного быстрее, чем GNU locate. Оба запускают под вторым созданием всей базы данных с нуля в моей установке Debian, когда все метаданные диска находятся в ОЗУ (что обычно и бывает).
Apple предоставляет mdfind
, который использует инкрементную базу данных, созданную mds
, которая в основном запускается событиями файловой системы. Это делает его (теоретически) намного более эффективным, чем даже mlocate
, который все еще должен пройти через всю структуру каталогов в поисках измененных каталогов. Проблема в том, что инкрементальные сборки накапливают ошибки. Вот почему locate
, с его полной перестройкой каждый раз, по-прежнему актуален и любим многими.
updatedb
просто запустите find
команду, чтобы найти все файлы, а затем обработайте вывод в файл базы данных. Поскольку в find
любом случае приходится сканировать все дерево каталогов, чтобы найти новые файлы, добавочное обновление не дает выигрыша в производительности (по крайней мере, оно не стоит затраченных усилий).mdfind
довольно хорошо, но нестабильно (иногда результаты появляются, а иногда нет).apt install locate
Debian Buster, я получаю базу данных от GNU findutils 4.6.0, которая создает новую $LOCATE_DB.n
и в случае успеха заменяет старую базу данных новой. Насколько я знаю, mds
делает добавочные обновления для mdfind
. Если mdfind
отсутствует что-то, что не исключено намеренно (например, настройками конфиденциальности или включением индексации диска), я рекомендую использовать locate
:-) Он не пытается делать инкрементные обновления, поэтому он намного надежнее, хотя и несколько устарел.locate
с MacPorts - я немного разочарован, поскольку MacPorts обычно просто не выпускает порт, который не работает должным образом.Версия Apple запускается через /usr/libexec/locate.updatedb
сценарий оболочки. Там из поиска исключены некоторые дополнительные пути. В Мохаве это
: ${PRUNEPATHS:="/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb"} # unwanted directories
PS: у меня нет Catalina, поэтому вам может потребоваться проверить, нужно ли исключать и другие пути.
gfind: failed to read file names from file system at or below '/'
Я пытался сделать с вашим предложением: sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /Volumes' --output=$HOME/locatedb_gupdatedb
и я получаю сообщение об ошибке выше. Как вы думаете, это проблема sudo?find
, а затем передает результат в средство обновления locateb. Не знаю, как работает версия GNU, но, возможно, вы можете просто использовать копию сценария оболочки, чтобы передать версию GNU.
без холма