Wenn ich find --version
mit GNU find verwende, erhalte ich ungefähr Folgendes:
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
Was bedeuten diese "Funktionen"? Es gibt einen Hinweis darauf, O_NOFOLLOW
dass es sich um eine Sicherheitsmaßnahme handelt man find
, und es wird erwähnt, LEAF_OPTIMISATION
dass es sich um eine Optimierung handelt, die einige lstat
Aufrufe von Blattknoten erspart . Aber ich kann nichts darüber finden FTS
, D_TYPE
oder CBO
.
Antworten:
Dies ist eine vollständige Antwort, die sich aus den Antworten von Ketan und Daniel Kullman sowie meiner eigenen Forschung ergibt.
Die meisten "Funktionen" stellen sich als Abfrageoptimierungen heraus, da sie
find
im Allgemeinen (fast) beliebig komplexe Abfragen im Dateisystem ausführen können.D_TYPE
Das Vorhandensein des
D_TYPE
Features bedeutet, dassfind
mit Unterstützung für dasd_type
Feld in kompiliert wurdestruct dirent
. Dieses Feld ist eine BSD-Erweiterung, die ebenfalls von Linux übernommen wurde und den Dateityp (Verzeichnis, Datei, Pipe, Socket, Zeichen- / Blockgerät usw.) in der vonreaddir
und Freunden zurückgegebenen Struktur angibt .find
Kann als Optimierung verwendet werden, umlstat
Anrufe zu reduzieren oder zu eliminieren , wenn-type
sie als Filterausdruck verwendet werden.readdir
d_type
Auf einigen Dateisystemen ist dies möglicherweise nicht immer derlstat
Fall , daher wird manchmal immer noch eine benötigt.Weitere Informationen finden Sie in der offiziellen Dokumentation: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html
O_NOFOLLOW
Diese Option liest entweder
(enabled)
oder(disabled)
. Wenn vorhanden und aktiviert, implementiert diese Funktion eine Sicherheitsmaßnahme, diefind
vor bestimmten TOCTTOU-Race-Angriffen schützt . Insbesondere wird verhindert, dassfind
ein Symlink beim Durchlaufen des Verzeichnisses durchlaufen wird. Dies kann auftreten, wenn das Verzeichnis durch einen Symlink ersetzt wird, nachdem der Dateityp des Verzeichnisses überprüft wurde, aber bevor das Verzeichnis eingegeben wurde.Wenn diese Option aktiviert ist,
find
werdenopen(..., O_NOFOLLOW)
im Verzeichnis nur echte Verzeichnisseopenat
geöffnet und anschließend Dateien in diesem Verzeichnis geöffnet.LEAF_OPTIMISATION
Diese etwas undurchsichtige Optimierung ermöglicht es
find
, anhand der Linkanzahl des übergeordneten Verzeichnisses abzuleiten, welche Unterverzeichnisse eines übergeordneten Verzeichnisses Verzeichnisse sind, da Unterverzeichnisse (über den..
Link) zur Linkanzahl des übergeordneten Verzeichnisses beitragen . Unter bestimmten Umständenfind
kann einstat
Anruf gelöscht werden . Wenn das Dateisystem oder das Betriebssystem jedoch falsch dargestellt wirdst_nlinks
, kann diesfind
zu falschen Ergebnissen führen (dies ist zum Glück ein sehr seltenes Ereignis).Weitere Informationen finden Sie in der offiziellen Dokumentation: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html
FTS
Wenn diese Funktion aktiviert ist, verwendet die
FTS
Funktionfind
diefts
API zum Durchlaufen der Dateihierarchie anstelle einer direkten rekursiven Implementierung.Mir ist nicht klar, was der Vorteil
fts
ist, aber esFTS
ist im Grunde die Standardeinstellung für alle Standardversionen, diefind
ich bisher gesehen habe.Weitere Informationen: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html , http://man7.org/linux/man-pages/man3/fts.3.html
CBO
Es stellt sich heraus (nach dem Lesen des
find
von Daniel Kullman vorgeschlagenen Quellcodes), dass sich "CBO" auf die Abfrageoptimierungsstufe bezieht (es steht für "kostenbasierter Optimierer"). Wenn ich es zum Beispiel tuefind -O9001 --version
, bekomme ichWenn ich mir die
-O
Option in anschaueman find
, sehe ichGeheimnis gelüftet! Es ist etwas seltsam, dass die Option ein Laufzeitwert ist. Normalerweise würde ich erwarten, dass die
--version
Ausgabe nur Optionen zur Kompilierungszeit widerspiegelt.quelle
Informationen zu finden Sie
O_NOFOLLOW
auf derinfo
Seite vonfind
:Aus dem Quellbaum,
CBO
tritt nur in der Dateiparser.c
:Dies ist eine kostenbasierte Optimierung (meine beste Vermutung).
D_TYPE
tritt an mehreren Stellen im Quellbaum auf und scheint mit dem Verzeichniseintragstyp zu tun zu haben:Ausbeuten:
und einige weitere Einträge. Die Quelle finden Sie hier .
quelle
Beim Durchsuchen des Findutils-Quellbaums ( http://git.savannah.gnu.org/cgit/findutils.git/tree/ ) habe ich Folgendes festgestellt:
Ich habe nichts über CBO gefunden; Möglicherweise müssen Sie den Quellcode herunterladen und nach dem Begriff suchen.
quelle