Cuando uso find --version
con GNU find, obtengo algo como esto:
find (GNU findutils) 4.5.9
[license text]
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
¿Qué significan estas "características"? Hay alguna referencia a O_NOFOLLOW
ser una medida de seguridad man find
, y hay una mención de LEAF_OPTIMISATION
ser una optimización que ahorra algunas lstat
llamadas en los nodos hoja. Pero no puedo encontrar nada sobre FTS
, D_TYPE
o CBO
.
Respuestas:
Esta es una respuesta completa derivada de las respuestas de Ketan y Daniel Kullman, así como de mi propia investigación.
La mayoría de las "características" resultan ser optimizaciones de consultas, ya
find
que en general es capaz de consultas (casi) arbitrariamente complejas en el sistema de archivos.D_TYPE
La presencia de la
D_TYPE
función significa quefind
se compiló con soporte para eld_type
campo enstruct dirent
. Este campo es una extensión BSD también adoptada por Linux, que proporciona el tipo de archivo (directorio, archivo, tubería, socket, dispositivo char / block, etc.) en la estructura devuelta porreaddir
y amigos. Como optimización,find
puede usar esto para reducir o eliminarlstat
llamadas cuando-type
se usa como una expresión de filtro.readdir
es posible que no siempre se llened_type
en algunos sistemas de archivos, por lo que a veceslstat
aún será necesario.Más información de la documentación oficial: https://www.gnu.org/software/findutils/manual/html_node/find_html/d_005ftype-Optimisation.html
O_NOFOLLOW
Esta opción leerá
(enabled)
o(disabled)
. Si está presente y habilitada, esta característica implementa una medida de seguridad que protegefind
contra ciertos ataques de carrera TOCTTOU. Específicamente, evitafind
atravesar un enlace simbólico mientras se realiza el recorrido del directorio, lo que podría ocurrir si el directorio fuera reemplazado por un enlace simbólico después de verificar el tipo de archivo del directorio pero antes de ingresar el directorio.Con esta opción habilitada,
find
se usaráopen(..., O_NOFOLLOW)
en el directorio para abrir solo directorios reales, luego se usaráopenat
para abrir archivos dentro de ese directorio.HOJA_OPTIMIZACIÓN
Esta optimización ligeramente oscura permite
find
deducir qué subdirectorios de un directorio padre son directorios mediante el uso del recuento de enlaces del directorio padre, ya que los subdirectorios contribuirán al recuento de enlaces del padre (a través del..
enlace). En ciertas circunstancias, permitiráfind
eludir unastat
llamada. Sin embargo, si el sistema de archivos o el sistema operativo tergiversanst_nlinks
, puedefind
producir resultados falsos (afortunadamente, esto es muy raro).Más información en la documentación oficial: https://www.gnu.org/software/findutils/manual/html_node/find_html/Leaf-Optimisation.html
FTS
Cuando está habilitada, la
FTS
característica hacefind
que use lafts
API para atravesar la jerarquía de archivos, en lugar de una implementación recursiva directa.No tengo claro cuál es la ventaja
fts
, peroFTS
es básicamente el valor predeterminado en todas lasfind
versiones predeterminadas que he visto hasta ahora.Más información: https://www.gnu.org/software/findutils/manual/html_node/find_html/fts.html , http://man7.org/linux/man-pages/man3/fts.3.html
CBO
Resulta (después de leer el
find
código fuente según lo sugerido por daniel kullman) que "CBO" se refiere al nivel de optimización de la consulta (significa "optimizador basado en costos"). Por ejemplo, si lo hagofind -O9001 --version
, me saleMirando la
-O
opción enman find
, veo¡Misterio resuelto! Es un poco extraño que la opción sea un valor de tiempo de ejecución; por lo general, esperaría que la
--version
salida solo refleje las opciones de tiempo de compilación.fuente
La información sobre
O_NOFOLLOW
se proporciona en lainfo
página defind
:Desde el árbol fuente,
CBO
ocurre solo en el archivoparser.c
:indicando que es una optimización basada en el costo (mi mejor suposición).
D_TYPE
ocurre en varios lugares en el árbol de origen y parece que tiene que ver con el tipo de entrada de directorio:Rendimientos:
Y algunas entradas más. Puedes encontrar la fuente aquí .
fuente
Al mirar a través del árbol fuente findutils ( http://git.savannah.gnu.org/cgit/findutils.git/tree/ ), encontré lo siguiente:
No encontré nada sobre CBO; es posible que deba descargar el código fuente y buscar el término.
fuente