it-swarm.com.de

Warum ist GNU find so schnell im Vergleich zu Dienstprogrammen für die grafische Dateisuche?

Ich versuche, eine Datei zu finden, die nicht in meinem Home-Verzeichnis und allen Unterverzeichnissen vorhanden ist.

find ~/ -name "bogus" gibt mir diese Informationen nach ein paar Sekunden, aber KDEs dolphin Dateimanager brauchte fast 3 Minuten, um dasselbe zu tun. Dies entspricht meiner vorherigen Erfahrung mit GNOME beagle .

Wie schafft es find, dasselbe sehr schnell zu tun, während die grafische Suche (die intuitiver zu verwenden ist als Befehlszeilenparameter) dahinter steckt?

47
Red

Wenn Sie Dolphin speziell mit Baloo betrachten, scheinen die Metadaten jeder Datei in ihrer Suchdomäne nachzuschlagen, selbst wenn Sie eine einfache Suche nach Dateinamen durchführen. Wenn ich die file.so Prozess, ich sehe Aufrufe von lstat, getxattr und getxattr erneut für jede Datei und sogar für .. Einträge. Diese Systemaufrufe rufen Metadaten zu der Datei ab, die an einem anderen Speicherort als der Dateiname gespeichert sind (der Dateiname wird im Verzeichnisinhalt gespeichert, die Metadaten befinden sich jedoch im inode ). Das mehrfache 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 bestehen.

find ist viel schlauer. Es wird versucht, unnötige Systemaufrufe zu vermeiden. getxattr wird nicht aufgerufen, da nicht nach erweiterten Attributen gesucht wird. Beim Durchlaufen eines Verzeichnisses muss möglicherweise lstat für nicht übereinstimmende Dateinamen aufgerufen werden, da dies ein Unterverzeichnis für die rekursive Suche sein kann (lstat ist der Systemaufruf, der Dateimetadaten einschließlich der Datei zurückgibt Typ wie reguläres/Verzeichnis/Symlink /…). find hat jedoch eine Optimierung: Es weiß, wie viele Unterverzeichnisse ein Verzeichnis aus seiner Linkanzahl hat, und es hört auf, lstat aufzurufen, sobald es weiß, dass es alle Unterverzeichnisse durchlaufen hat . Insbesondere in einem Blattverzeichnis (einem Verzeichnis ohne Unterverzeichnisse) überprüft find nur die Namen, nicht die Metadaten. Darüber hinaus behalten einige Dateisysteme eine Kopie des Dateityps im Verzeichniseintrag bei, sodass find nicht einmal lstat aufrufen muss, wenn dies die einzigen benötigten Informationen sind.

Wenn Sie find mit Optionen ausführen, bei denen die Metadaten überprüft werden müssen, werden mehr lstat Aufrufe ausgeführt, es wird jedoch immer noch kein lstat Aufruf für eine Datei ausgeführt, wenn dies der Fall ist benötigt die Informationen nicht (zum Beispiel, weil die Datei durch eine vorherige Bedingung ausgeschlossen wird, die mit dem Namen übereinstimmt).

Ich vermute, dass andere GUI-Suchwerkzeuge, die das find -Rad neu erfinden, ähnlich weniger clever sind als das Befehlszeilenprogramm, das jahrzehntelang optimiert wurde. Zumindest Dolphin ist clever genug, um die Lokalisierungsdatenbank zu verwenden, wenn Sie "überall" suchen (mit der Einschränkung, dass in der Benutzeroberfläche nicht klar ist, dass die Ergebnisse möglicherweise veraltet sind).