Lorsque j'utilise find --version
avec GNU find, j'obtiens quelque chose comme ceci:
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
Que signifient ces «fonctionnalités»? Il y a une référence à O_NOFOLLOW
être une mesure de sécurité man find
, et il y a une mention d' LEAF_OPTIMISATION
être une optimisation qui enregistre quelques lstat
appels sur les nœuds feuilles. Mais je ne peux pas trouver quoi que ce soit au sujet FTS
, D_TYPE
ou CBO
.
Réponses:
Ceci est une réponse complète dérivée des réponses de Ketan et de Daniel Kullman, ainsi que de mes propres recherches.
La plupart des "fonctionnalités" s'avèrent être des optimisations de requêtes, car elles
find
sont en général capables de requêtes (presque) arbitrairement complexes sur le système de fichiers.D_TYPE
La présence de la
D_TYPE
fonctionnalité signifie qu'elle afind
été compilée avec le support dud_type
champ enstruct dirent
. Ce champ est une extension BSD également adoptée par Linux, qui fournit le type de fichier (répertoire, fichier, pipe, socket, périphérique char / block, etc.) dans la structure renvoyée parreaddir
et amis. En optimisation,find
pouvez l'utiliser pour réduire ou éliminer leslstat
appels lorsqu'il-type
est utilisé comme expression de filtre.readdir
ne remplit pas toujoursd_type
sur certains systèmes de fichiers, donc parfois unlstat
sera toujours nécessaire.Plus d'informations dans la documentation officielle: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html
O_NOFOLLOW
Cette option affichera soit
(enabled)
ou(disabled)
. Si elle est présente et activée, cette fonction met en œuvre une mesure de sécurité qui protègefind
de certaines attaques de course TOCTTOU. Plus précisément, il empêchefind
de traverser un lien symbolique lors de la traversée du répertoire, ce qui pourrait se produire si le répertoire était remplacé par un lien symbolique après la vérification du type de fichier du répertoire mais avant la saisie du répertoire.Avec cette option activée,
find
utiliseraopen(..., O_NOFOLLOW)
sur le répertoire pour ouvrir uniquement les vrais répertoires, puis utiliseraopenat
pour ouvrir les fichiers dans ce répertoire.LEAF_OPTIMISATION
Cette optimisation légèrement obscure permet
find
de déduire quels sous-répertoires d'un répertoire parent sont des répertoires en utilisant le nombre de liens du répertoire parent, car les sous-répertoires contribueront au nombre de liens du parent (via le..
lien). Dans certaines circonstances, cela permettrafind
d'éluder unstat
appel. Cependant, si le système de fichiers ou le système d'exploitation déformest_nlinks
, cela peut entraînerfind
des résultats faux (c'est heureusement un événement très rare).Plus d'informations dans la documentation officielle: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html
FTS
Lorsqu'elle est activée, la
FTS
fonction obligefind
à utiliser l'fts
API pour parcourir la hiérarchie des fichiers, au lieu d'une implémentation récursive directe.Je ne sais pas clairement quel est l'avantage
fts
, maisFTS
c'est essentiellement la valeur par défaut sur toutes lesfind
versions par défaut que j'ai vues jusqu'à présent.Plus d'informations: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html , http://man7.org/linux/man-pages/man3/fts.3.html
CBO
Il s'avère (après avoir lu le
find
code source comme suggéré par Daniel Kullman) que "CBO" se réfère au niveau d'optimisation de requête (il signifie "optimiseur basé sur les coûts"). Par exemple, si je le faisfind -O9001 --version
, je reçoisEn regardant l'
-O
option dansman find
, je voisMystère résolu! Il est un peu étrange que l'option soit une valeur d'exécution; habituellement, je m'attendrais à ce que la
--version
sortie reflète uniquement les options de compilation.la source
Des informations sur
O_NOFOLLOW
sont données dans lainfo
page defind
:Dans l'arborescence source,
CBO
apparaît uniquement dans le fichierparser.c
:indiquant qu'il s'agit d'une optimisation basée sur les coûts (ma meilleure estimation).
D_TYPE
se produit à plusieurs endroits dans l'arborescence source et semble avoir à voir avec le type d'entrée de répertoire:Rendements:
et quelques entrées supplémentaires. Vous pouvez trouver la source ici .
la source
En parcourant l'arbre source de findutils ( http://git.savannah.gnu.org/cgit/findutils.git/tree/ ), j'ai trouvé ce qui suit:
Je n'ai rien trouvé sur CBO; vous devrez peut-être télécharger le code source et rechercher le terme ..
la source