El -depthprimario a findhace que realice una búsqueda profunda primero.
Sin embargo, la secuencia predeterminada no es una búsqueda de amplitud.
La secuencia predeterminada podría describirse informalmente como un "recorrido de profundidad primero que maneja los nodos cuando se encuentran por primera vez en lugar de hacerlo durante el retroceso".
Tengo una necesidad real de amplitud primera búsqueda. ¿Cómo puedo hacer que se findcomporte de esta manera?
Por ejemplo, con la siguiente configuración:
$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}
find tiene el siguiente comportamiento predeterminado:
$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo
y con -depth, se realiza de la siguiente manera:
$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha
Sin embargo, lo que quiero es la siguiente opción (ficticia):
$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
En otras palabras, necesito findprocesar / informar sobre todos los archivos / directorios a una profundidad determinada antes de continuar.
¿Cómo puedo hacer esto?

find(al menos, no solo confind). ¿Desea solo enumerar los archivos o desea utilizar otras primarias?-bfsno sería lo que necesito ... Tengo un script simple que genera un índice para un gran proyecto de GitLab, adecuado para su inclusión en el Wiki de GitLab. Hace que los encabezados se basen jerárquicamente en los nombres de directorio. Funciona muy bien, excepto que en la estructura de archivos de ejemplo anterior se colocaríadeltadebajo delcharliesubtítulo, en lugar de debajo delalphaencabezado principal .findsalida está ordenada alfabéticamente. No tengo idea de por qué ....-bfspodría ser útil, incluso si no se ajusta perfectamente a este caso de uso.Respuestas:
Puede hacerlo solo con comodines de shell. Construya un patrón con progresivamente más niveles de directorio.
Esto pierde archivos de puntos. Use
FIGNORE='.?(.)'en ksh,shopt -s dotgloben bash osetopt glob_dotsen zsh para incluirlos.Advertencias:
Si desea elegir el orden o directorios y no directorios, y el rendimiento no es crítico, puede hacer dos pases y probar
[ -d "$file" ]en cada pase.fuente
*. :)nullgloby use(($#))como condición de bucle para evitar este caso límite.# cat ./bfindEsto funciona aumentando la profundidad
findy repitiendo, creo que puede repetir resultados, pero podría filtrarse fácilmentefuente
Puede canalizarlo
finden un orden que se clasifica principalmente por el número de/caracteres en el nombre de ruta. Por ejemplo,Esto se usa
awkpara prefijar el nombre de ruta con el número de barras ysedpara eliminar este prefijo al final.En realidad, como probablemente desee
alpha/charlie+que se enumeren los contenidos del directorioalpha/charlie, debe decirsort -t/ -k1,1 -k2,2 -k3,3 -k4,4hasta la profundidad deseada.fuente
Otra respuesta no basada en 'find' sino en bash: use primero la "longitud del directorio padre", luego ordene por alfa.
La respuesta no coincide ya que sus resultados tienen "Charlie, Bravo, Delta", pero me preguntaba si debería ser "Bravo, Charlie, Delta" en orden alfa.
Eso produce
fuente