Ich versuche, die GNU-Version des Befehls zu testen locate
. Zuerst muss ich die Datenbank wie folgt erstellen:
sudo gupdatedb --prunepaths=/Volumes --output=$HOME/locatedb_gupdatedb
Leider erhalte ich 1 Minute nach dem Start des Befehls immer noch die folgende Fehlermeldung:
gfind: failed to read file names from file system at or below '/': No such file or directory
Ich verstehe nicht, woher dieser Fehler kommen könnte?
UPDATE 1: Ich habe es gfind
durch find
ein Komma und den korrekten Pfad ersetzt, find
dessen /usr/bin/
. Leider bekomme ich peinliche Fehlermeldungen wie diese, wenn ich den gupdatedb
Befehl wie folgt starte:
sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /Volumes /System' --output=$HOME/locatedb_gupdatedb
Hier die Fehlermeldungen:
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
Ich habe versucht , die Option in die Datei zu ändern :
: ${FINDOPTIONS="2 > /dev/null"}
Aber das Problem ist, dass diese Option vor dem Befehl gesetzt wird find
, nicht am Ende, also ist sie im Folgenden der Datei nicht korrekt.
find
Angesichts der Tatsache , dass das Skript viele Befehle enthält , kann ich die 2 > /dev/null
Terminaloption nicht jedes Mal manuell hinzufügen.
Jeder konnte sehen, wie man all diese Fehlermeldungen vom find
Befehl unterdrückt, wenn ich einen gupdatedb
Befehl starte?
UPDATE 2: Ich habe es endlich geschafft, eine Datenbank mit gupdatedb (GNU-Version des MacOS- updatedb
Befehls) zu erstellen, indem ich Folgendes mache:
sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /System /Volumes' --output=$HOME/locatedb_gupdatedb
Das Problem ist jetzt, wenn ich eine Suche nach einer Teilzeichenfolge einer Datei oder eines Verzeichnisses durchführe, scheinen die Informationen in den Ergebnissen dupliziert zu werden ( sub_string
ist einfach der Teil eines Datei- oder Verzeichnisnamens):
Wenn ich z.B. folgendes mache:glocate -d ~/locatedb_gupdatedb sub_string
Dann habe ich doppelte Ergebnisse wie:
/System/Volumes/Data/Users/fab/sub_string.dat
/Users/fab/sub_string.dat
Ich weiß nicht, wie ich ' /System/Volumes/Data/
' aus diesen Ergebnissen ausschließen soll: Ich habe jedoch in --prunepaths
der Option das Verzeichnis genau angegeben System
, warum wird es in der von erstellten Datenbank nicht berücksichtigt gupdatedb
?
Oder vielleicht sollte ich eine durchführen:
sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /System/Volumes/Data /Volumes' --output=$HOME/locatedb_gupdatedb
??
Jede Hilfe ist willkommen, um dieses Verzeichnis auszuschließen
/System/Volumes/Data
aus der Indizierungsdatenbank.
UPDATE 3: Hier ist ein Beispiel für die schnelle Generierung einer Datenbank mit updatedb on Debian 10 Buster
. Zwischen den Zeitstempeln der beiden Befehle wurden einige Änderungen der normalen Verwendungupdatedb
vorgenommen .
Daher schließe ich, dass es wirklich einen Unterschied zwischen der GNU/MacOS- und der GNU/Linux-Implementierung gibt.
Jede Erklärung ist willkommen.
Das Problem hier ist, dass Sie GNUs updatedb
mit dem macOS ausführen find
. gupdatedb
ist ein Shell-Skript, das erwartet, eine GNU-kompatible find
. Insbesondere konvertiert es --prunepaths
in einen GNU-kompatiblen einfachen regulären Ausdruck.
--prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /Volumes /System'
konvertiert zu
PRUNEREGEX="\(^/private/tmp$\)\|\(^/private/var/folders$\)\|\(^/private/var/tmp$\)\|\(^*/Backups.backupdb$\)\|\(^/System$\)\|\(^/Volumes$\)"
GNU BRE (einfache reguläre Ausdrücke) behandelt \|
als "alternativen" Operator:
'foo\|bar' stimmt entweder mit 'foo' oder 'bar' überein
Dies ist eine GNU-Erweiterung der BRE-Syntax, und der macOS- find
Operator akzeptiert sie nicht. Die ganze Pflaumenkette stimmt also mit nichts überein.
Das macOS (und POSIX) BRE hat keinen alternativen Operator, daher ist es keine super einfache Lösung. Das macOS-Skript updatedb wandelt die Alternative in explizite -or
Operatoren im find
Befehl um. Dazu können Sie das GNU-Skript modifizieren. Oder mach dich gfind
an die Arbeit.
Übrigens baut GNUs updatedb-Skript bei jedem Lauf eine komplett neue Datenbank auf, genau wie die von macOS.
Ihre Debian-Installation verwendet mlocate , eine völlig andere Implementierung als GNU locate, nicht so weit portiert und AFAIK nicht auf macOS verfügbar. Und obwohl mlocate
es auf Ihrer Debian-Installation schnell läuft, bedeutet das nicht, dass es viel schneller läuft als GNU locate. Beide laufen unter einem zweiten Aufbau der gesamten Datenbank auf meiner Debian-Installation von Grund auf neu, wenn sich alle Festplatten-Metadaten im RAM befinden (was normalerweise der Fall ist).
Apple bietet mdfind
, das die von erstellte inkrementelle Datenbank verwendet mds
, die größtenteils durch Dateisystemereignisse ausgelöst wird. Dies macht es (theoretisch) viel effizienter als sogar mlocate
, das immer noch die gesamte Verzeichnisstruktur durchlaufen muss, um nach geänderten Verzeichnissen zu suchen. Das Problem besteht darin, dass sich bei inkrementellen Builds Fehler ansammeln. Aus diesem Grund locate
ist , jedes Mal komplett neu aufgebaut, immer noch da und wird von vielen bevorzugt.
updatedb
führen Sie einfach einen find
Befehl aus, um alle Dateien zu finden, und verarbeiten dann die Ausgabe in eine Datenbankdatei. Da find
ohnehin der gesamte Verzeichnisbaum durchsucht werden muss, um neue Dateien zu finden, bringt ein inkrementelles Update keinen Performance-Vorteil (zumindest keinen der Mühe wert).mdfind
ist ziemlich gut, aber instabil (manchmal erscheinen Ergebnisse und manchmal nicht).apt install locate
Debian Buster verwende, erhalte ich die von GNU findutils 4.6.0, die eine neue erstellt $LOCATE_DB.n
und bei Erfolg die alte Datenbank durch die neue ersetzt. AFAIK, mds
führt inkrementelle Updates für mdfind
. Wenn mdfind
etwas fehlt, das absichtlich nicht ausgeschlossen wurde (z. B. durch Datenschutzeinstellungen oder das Ausschalten der Indizierung eines Laufwerks), empfehle ich die Verwendung locate
:-) Es versucht nicht, inkrementelle Updates durchzuführen, ist also viel zuverlässiger, wenn auch etwas veraltet.locate
von MacPorts installiert - ich bin etwas enttäuscht, da MacPorts normalerweise einen Port nicht freigibt, der nicht richtig funktioniert./usr/libexec/locate.updatedb
Die Apple-Version wird über ein Shell-Skript ausgeführt . Einige zusätzliche Pfade sind dort von der Suche ausgeschlossen. In Mojave sind dies
: ${PRUNEPATHS:="/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb"} # unwanted directories
PS: Ich habe kein Catalina, daher müssen Sie möglicherweise prüfen, ob andere Pfade ebenfalls ausgeschlossen werden müssen.
gfind: failed to read file names from file system at or below '/'
.Ich habe versucht, mit Ihrem Vorschlag zu tun: sudo gupdatedb --prunepaths='/private/tmp /private/var/folders /private/var/tmp */Backups.backupdb /Volumes' --output=$HOME/locatedb_gupdatedb
und ich erhalte die obige Fehlermeldung. Glaubst du, es ist ein sudo-Problem?find
und speist dann das Ergebnis in den locateb-Updater ein. Ich weiß nicht, wie die GNU-Version funktioniert, aber vielleicht können Sie einfach eine Kopie des Shell-Skripts verwenden, um die GNU-Version zu füttern.
kein Hang