
Ich versuche, /usr/bin/find
etwas 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 getdents
Systemaufrufs hervorgeht, ist d_type
dort ein Feld vorhanden, sodass find
einige für Entscheidungen erforderliche Informationen bereits vorhanden sein sollten.
Warum muss man das tun , stat
unabhängig von oder welchen Optionen auch immer.-L
-H
Antwort1
Benutze die Quelle, Luke!
Im GNU- find
Quellcode (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 nichtprocfs
odernfs
), 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 von
DT_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 find
sehen 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 find
Handbuch 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_type
Optimierung 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 stat
für alle Szenarien zu verwenden find
, in denen dies erforderlich sein könnte. Außerdem nimmt dies Zeit in Anspruch.