Estoy tratando de encontrar un archivo que no existe en mi directorio de inicio y en todos los subdirectorios.
find ~/ -name "bogus"
me da esa información después de unos segundos, pero el dolphin
administrador de archivos de KDE necesitó casi 3 minutos para hacer lo mismo. Esto corresponde con mi experiencia previa con GNOMEbeagle
.
¿Cómo se las find
arregla para hacer lo mismo muy rápido mientras la búsqueda gráfica (que es más intuitiva de usar que los parámetros de la línea de comandos) se queda atrás?
find
performance
dolphin
rojo
fuente
fuente
locate
más frecuenciafind
y es más rápido en una carpeta enormelocate
es realmente excelente para encontrar archivos, esto es un poco OT, ya que utiliza un enfoque completamente diferente:find
y las herramientas de GUI comoDolphin
atraviesan el árbol de archivos a pedido, mientraslocate
usan una estructura de índice creada previamente.Respuestas:
Mirando específicamente a Dolphin con Baloo, parece buscar los metadatos de cada archivo en su dominio de búsqueda, incluso si está haciendo una simple búsqueda de nombre de archivo. Cuando trazo el
file.so
proceso, veo llamadas alstat
,getxattr
ygetxattr
nuevamente para cada archivo, e incluso para las..
entradas. Estas llamadas al sistema recuperan metadatos sobre el archivo que se almacena en una ubicación diferente del nombre del archivo (el nombre del archivo se almacena en el contenido del directorio, pero los metadatos están en el inodo ). Consultar los metadatos de un archivo varias veces es barato, ya que los datos estarían en el caché del disco, pero puede haber una diferencia significativa entre consultar los metadatos y no consultar los metadatos.find
Es mucho más inteligente. Intenta evitar llamadas innecesarias al sistema. No llamarágetxattr
porque no busca en función de atributos extendidos. Cuando atraviesa un directorio, es posible que necesite invocarlstat
nombres de archivo que no coinciden porque puede ser un subdirectorio para buscar de forma recursiva (lstat
es la llamada al sistema que devuelve metadatos de archivo, incluido el tipo de archivo como regular / directorio / enlace simbólico / ...). Sin embargo,find
tiene una optimización: sabe cuántos subdirectorios tiene un directorio desde su recuento de enlaces , y deja de llamarlstat
una vez que sabe que ha recorrido todos los subdirectorios. En particular, en un directorio hoja (un directorio sin subdirectorios),find
solo verifica los nombres, no los metadatos. Además, algunos sistemas de archivos mantienen una copia del tipo de archivo en la entrada del directorio para quefind
ni siquiera tenga que llamarlstat
si esa es la única información que necesita.Si ejecuta
find
opciones que requieren verificar los metadatos, realizará máslstat
llamadas, pero aún no hará unalstat
llamada en un archivo si no necesita la información (por ejemplo, porque el archivo está excluido por una condición previa coincidencia en el nombre).Sospecho que otras herramientas de búsqueda de GUI que reinventan la
find
rueda son igualmente menos inteligentes que la utilidad de línea de comandos que ha sufrido décadas de optimización. Dolphin, al menos, es lo suficientemente inteligente como para usar la base de datos de localización si busca "en todas partes" (con la limitación que no está clara en la interfaz de usuario de que los resultados pueden estar desactualizados).fuente
2 + number of sub-directories.
Esto funciona para sistemas de archivos que implementan el error de diseño del sistema de archivos UNIX V7, pero no para todos los sistemas de archivos, ya que este no es un requisito POSIX . Si desea obtener un número de rendimiento útil para GNU make, debe especificar-noleaf
el orden para que GNU make se comporte correctamente.find
puede haber tenido ese error hace mucho tiempo, pero dudo que encuentres un caso en el que necesites especificarlo-noleaf
a mano hoy en día. AFAICT, al menos en Linuxgetdents()
(y readdir ()) le dice qué archivos son archivos de directorio en UDF, ISO-9660, btrfs que no tienen entradas reales.
o..
y sefind
comporta bien allí. ¿Conoces un caso en el que GNUfind
muestra el problema?find
. Y, en cualquier caso,strace -v
muestra quegetdents()
devuelve correctamente d_type = DT_DIR para directorios, por lo que GNU find no tiene que usar el truco de conteo de enlaces.