Warum mag „find“ „stat“ oder „fstat“ so sehr?

Warum mag „find“ „stat“ oder „fstat“ so sehr?

Ich versuche, /usr/bin/findetwas Sinnvolles anzuzeigen, ohne irgendetwas zu tun stat, bisher ohne brauchbare Ergebnisse. Wenn ich zwangsweise unterdrücke stat, stoppt find das Absteigen in Unterverzeichnisse überhaupt.

Wie aus der Manualpage des getdentsSystemaufrufs hervorgeht, ist d_typedort ein Feld vorhanden, sodass findeinige für Entscheidungen erforderliche Informationen bereits vorhanden sein sollten.

Warum muss man das tun , statunabhängig von oder welchen Optionen auch immer.-L-H

Antwort1

Benutze die Quelle, Luke!

Im GNU- findQuellcode (ich betrachte Version 4.2.2) befindet sich der Code, der Verzeichnisbäume durchläuft, in gnulib/lib/fts.c. In Zeile 1123 gibt es den folgenden Kommentar:

Notieren Sie, was fts_read mit diesem Eintrag zu tun hat. In vielen Fällen wird es einfach fts_stat ausführen, aber wir können jede d_type-Information nutzen, um die unnötigen Stat-Aufrufe zu optimieren. D. h., wenn FTS_NOSTAT in Kraft ist und wir keinen Symlinks folgen (FTS_PHYSICAL) und d_type anzeigt, dass dies der Fall istnichtein Verzeichnis, dann müssen wir es überhaupt nicht angeben. Wenn esIstein Verzeichnis, dann (derzeit) stat wir es trotzdem, um Geräte- und Inode-Nummern zu erhalten. Eines Tages werden wir das vielleicht auch für Verzeichnisse optimieren, bei denen d_ino als gültig bekannt ist.

Sie haben also über die von Ihnen beschriebene Optimierung nachgedacht, diese ist jedoch nicht umgesetzt.

Antwort2

Die zitierte Manualpage fürAbonnierenist Linux-spezifisch und gilt nicht für alle Dateisystemtypen (die Manualpage erwähnt beispielsweise nichtprocfsodernfs), während GNUfindenist nicht plattformspezifisch (auf der Manualpage wird SELinux erwähnt, was wohl eine nützliche Funktion ist, die man berücksichtigen sollte). Eskönnteauch für diesen Spezialfall optimiert werden.

Auch wenn die Funktion verfügbar ist, empfiehlt die Manualpage:

Alle Anwendungen müssen ordnungsgemäß eine Rückgabe vonDT_UNKNOWN.

Das heißt, die Informationen können, sofern verfügbar, nützlich sein, es gibt jedoch keine Garantie dafür, dass sie vorhanden sind.

Angesichts all dieser Nachteile findsehen die Entwickler möglicherweise keine Notwendigkeit für diese Optimierung. Ein motivierter Benutzer könnte sich den Quellcode ansehen, um zu sehen, wie dies funktioniert, und eine geeignete ifdef-Änderung vorschlagen.

@Nate Eldredgestellt fest, dass jemandgestartetin diese Richtung. Das findHandbuch besagt in7.2 d_type Optimierung

Wenn diese Funktion aktiviert ist, nutzt find die Tatsache aus, dass readdir auf einigen Systemen den Typ einer Datei in der Struktur dirent zurückgibt.

Das Feature warErsterwähnungIn

2005-01-17  James Youngman  <[email protected]>
    * configure.in, find/defs.h, find/find.c, find/parser.c, find/pred.c, find/tree.c, find/util.c:
    Implemented d_type optimisation but not working correctly, so currently disabled

Später war esüberarbeitet zur Verwendung von Gnulibum dies zu unterstützen:

2010-04-08  James Youngman  <[email protected]>

    Adopt the use of the gnulib module d-type.
    * import-gnulib.config (modules): Import the d-type module.
    * configure.ac: Remove old struct dirent.d_type detection logic
    (since we now use the gnulib macro from the d-type module for
    this).

Version 4.2.2 ist übrigens ziemlich alt (vielleicht ein Tippfehler):4.2.3stammt aus dem Jahr 2004 und liegt vor diesen Changelog-Einträgen. Der aktuelle Release-Tag in Git lautet4.5.14(Mitte 2014).

Unabhängig vom Status einer d_typeOptimierung sind die Entwickler daran interessiert, die Anzahl der Aufrufe von zu reduzieren stat. Ein Hinweis von4.5.4(10.03.2009) sagt beispielsweise:

Die ausführbare Datei ftsfind vermeidet jetzt auch den Aufruf von stat()-Funktionen, um die Inode-Nummer einer Datei zu ermitteln, wenn wir diese Information bereits aus dem Verzeichnis gelesen haben. Dies führt zwar zu einer Beschleunigung, jedoch nur für einen eingeschränkten Satz von Befehlen wie „find . -inum 4001“. Dieser Fix ist unten als Fehler Nr. 24342 aufgeführt.

Zusammenfassend: OP fragte

Warum ist dies für die Statistik erforderlich, unabhängig von -L, -H oder anderen Optionen?

Der Grund hierfür liegt darin, dass es sich um einen Sonderfall handelt und es schwierig ist, ihn reibungslos zum Laufen zu bringen, anstatt ihn statfür alle Szenarien zu verwenden find, in denen dies erforderlich sein könnte. Außerdem nimmt dies Zeit in Anspruch.

verwandte Informationen