¿Por qué a "find" le gusta tanto "stat" o "fstat"?

¿Por qué a "find" le gusta tanto "stat" o "fstat"?

Estoy tratando de /usr/bin/findmostrar algo significativo sin hacer ningún tipo de acción stat, sin resultados útiles hasta el momento. Si inhibo con fuerza stat, find deja de descender a subdirectorios.

Como getdentsdice la página del manual de syscall, hay d_typeun campo allí, por lo que findya debería tener cierta información necesaria para tomar decisiones.

¿Por qué es necesario hacerlo statindependientemente de -Lo -Hcualesquiera opciones?

Respuesta1

¡Usa la fuente, Luke!

En la findfuente GNU (estoy viendo la versión 4.2.2), el código que atraviesa los árboles de directorios está en formato gnulib/lib/fts.c. En la línea 1123 hay el siguiente comentario:

Registre qué tendrá que ver fts_read con esta entrada. En muchos casos, simplemente lo fts_stat, pero podemos aprovechar cualquier información de d_type para optimizar las llamadas de estadísticas innecesarias. Es decir, si FTS_NOSTAT está vigente y no estamos siguiendo enlaces simbólicos (FTS_PHYSICAL) y d_type indica que esto esnoun directorio, entonces no tendremos que establecerlo en absoluto. Si seesun directorio, luego (actualmente) lo establecemos independientemente, para obtener los números de dispositivo e inodo. Algún día podríamos optimizarlo también para directorios donde se sabe que d_ino es válido.

Han pensado en la optimización que usted describe, pero no está implementada.

Respuesta2

La página del manual citada paraobtener abolladurases específico de Linux y no se aplica a todos los tipos de sistemas de archivos (por ejemplo, la página del manual no mencionaprocfsonfs), mientras que GNUencontrarno es específico de la plataforma (su página de manual menciona SELinux, lo cual podría decirse que es una característica útil a tener en cuenta). Élpodríaoptimizarse también para este caso especial.

Incluso si la función está disponible, la página del manual recomienda:

Todas las aplicaciones deben manejar adecuadamente una devolución deDT_UNKNOWN.

Es decir, la información, si está disponible, puede ser útil, pero no se garantiza que esté presente.

Con todos esos inconvenientes, findes posible que los desarrolladores no vean la necesidad de esta optimización. Un usuario motivado podría profundizar en el código fuente para ver cómo hacer esto y proponer un cambio ifdef adecuado.

@Nate Eldredgenota que alguiencomenzóen esta dirección. El findmanual indica en7.2 Optimización d_type

Cuando esta característica está habilitada, find aprovecha el hecho de que en algunos sistemas readdir devolverá el tipo de archivo en struct dirent.

La característica eramencionado por primera vezen

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

Más tarde, fuerevisado para usar gnulibpara apoyar esto:

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).

Por cierto, la versión 4.2.2 es bastante antigua (quizás un error tipográfico):4.2.3data de 2004 y es anterior a estas entradas del registro de cambios. La etiqueta de lanzamiento actual en git es4.5.14(mediados de 2014).

Independientemente del estado de una d_typeoptimización, los desarrolladores están interesados ​​en reducir el número de llamadas a stat. una nota de4.5.4(2009-03-10) dice por ejemplo:

El ejecutable ftsfind ahora también evita llamar a funciones stat() para descubrir el número de inodo de un archivo, si ya leímos esta información del directorio. Esto proporciona una aceleración, pero sólo para un conjunto restringido de comandos como "find . -inum 4001". Esta solución se enumera a continuación como error n.º 24342.

En resumen: OP preguntó

¿Por qué necesitar una estadística independientemente de -L, -H o cualquier opción?

La razón es que es un caso especial en el que es problemático lograr que funcione sin problemas en lugar de hacerlo staten todos los escenarios en los que findpodría ser necesario, y que lleva tiempo hacerlo.

información relacionada