Ich versuche, eine Datei zu finden, die nicht in meinem Ausgangsverzeichnis und allen Unterverzeichnissen vorhanden ist.
find ~/ -name "bogus"
gibt mir diese Information nach ein paar Sekunden, doch der dolphin
Dateimanager von KDE brauchte fast 3 Minuten, um dasselbe zu tun. Dies entspricht meinen bisherigen Erfahrungen mit GNOMEbeagle
.
Wie gelingt find
es, dasselbe sehr schnell zu tun, während die grafische Suche (die intuitiver zu bedienen ist als Befehlszeilenparameter) hinterherhinkt?
find
performance
dolphin
rot
quelle
quelle
locate
öfter alsfind
und es ist schneller in einem riesigen Ordnerlocate
ist es sehr gut, Dateien zu finden, aber es ist ein bisschen OT, da es einen völlig anderen Ansatz verwendet:find
und GUI-Tools wieDolphin
durchlaufen den Dateibaum bei Bedarf, währendlocate
sie eine zuvor erstellte Indexstruktur verwenden.Antworten:
Wenn Sie Dolphin mit Baloo genauer betrachten, scheint es, als würden die Metadaten jeder Datei in ihrer Suchdomäne nachgeschlagen, selbst wenn Sie eine einfache Suche nach Dateinamen durchführen. Wenn ich den
file.so
Prozess nachverfolgelstat
, werden für jede Datei und sogar für Einträge Aufrufe angetxattr
undgetxattr
wieder..
angezeigt. Diese Systemaufrufe rufen Metadaten zu der Datei ab, die an einem anderen Ort als dem Dateinamen gespeichert sind (der Dateiname wird im Verzeichnisinhalt gespeichert, die Metadaten befinden sich jedoch im Inode ). Das mehrmalige Abfragen der Metadaten einer Datei ist kostengünstig, da sich die Daten im Festplatten-Cache befinden. Es kann jedoch einen signifikanten Unterschied zwischen dem Abfragen der Metadaten und dem Nichtabfragen der Metadaten geben.find
ist viel schlauer. Es wird versucht, unnötige Systemaufrufe zu vermeiden. Es wird nicht aufgerufen,getxattr
da nicht anhand erweiterter Attribute gesucht wird. Wenn es ein Verzeichnis durchläuft, muss es möglicherweiselstat
nicht übereinstimmende Dateinamen aufrufen, da dies ein Unterverzeichnis für die rekursive Suche sein kann (dieslstat
ist der Systemaufruf, der Dateimetadaten einschließlich des Dateityps wie regulär / directory / symlink /… zurückgibt). Esfind
hat jedoch eine Optimierung: Es erkennt anhand der Verbindungsanzahl , wie viele Unterverzeichnisse ein Verzeichnis hat , und beendet den Aufruf,lstat
sobald es weiß, dass es alle Unterverzeichnisse durchlaufen hat. Insbesondere in einem Blattverzeichnis (einem Verzeichnis ohne Unterverzeichnisse)find
Überprüft nur die Namen, nicht die Metadaten. Darüber hinaus behalten einige Dateisysteme eine Kopie des Dateityps im Verzeichniseintrag, sodassfind
sie nicht einmal aufrufen müssen,lstat
wenn dies die einzigen Informationen sind, die sie benötigen.Wenn Sie
find
Optionen ausführen, bei denen die Metadaten überprüft werden müssen, werden zwar mehrlstat
Aufrufe ausgeführt, es wird jedoch trotzdem keinlstat
Aufruf für eine Datei ausgeführt, wenn die Informationen nicht benötigt werden (z. B. weil die Datei durch eine frühere Bedingung ausgeschlossen ist) passend zum Namen).Ich vermute, dass andere GUI-Suchwerkzeuge, die das
find
Rad neu erfinden, weniger clever sind als das Kommandozeilen-Dienstprogramm, das jahrzehntelang optimiert wurde. Zumindest Dolphin ist clever genug, um die Suchdatenbank zu verwenden, wenn Sie "überall" suchen (mit der Einschränkung, dass die Ergebnisse möglicherweise nicht mehr aktuell sind).quelle
2 + number of sub-directories.
Dies funktioniert für Dateisysteme, die den Design-Fehler aus dem UNIX V7-Dateisystem implementieren, jedoch nicht für alle Dateisysteme, da dies keine POSIX-Anforderung ist . Wenn Sie eine nützliche Performance-Nummer für GNU make erhalten möchten, müssen Sie vorgeben-noleaf
, dass sich GNU make korrekt verhält.find
hatte diesen Fehler vielleicht schon vor langer Zeit, aber ich bezweifle, dass Sie einen Fall finden, in dem Sie ihn-noleaf
heutzutage manuell angeben müssen . AFAICT gibt mindestens unter Linuxgetdents()
(und readdir ()) an, welche Dateien Verzeichnisdateien in UDF, ISO-9660, BTRFS sind, die keine reellen.
oder..
Einträge haben, undfind
verhält sich dort OK. Kennen Sie einen Fall, in dem GNUfind
das Problem aufweist?find
. Und zeigt auf jeden Fall,strace -v
dassgetdents()
d_type = DT_DIR für Verzeichnisse korrekt zurückgegeben wird, sodass GNU find den Link Count Trick nicht verwenden muss.