El -depth
primario a find
hace 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 find
comporte 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 find
procesar / 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?-bfs
no 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íadelta
debajo delcharlie
subtítulo, en lugar de debajo delalpha
encabezado principal .find
salida está ordenada alfabéticamente. No tengo idea de por qué ....-bfs
podrí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 dotglob
en bash osetopt glob_dots
en 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
*
. :)nullglob
y use(($#))
como condición de bucle para evitar este caso límite.# cat ./bfind
Esto funciona aumentando la profundidad
find
y repitiendo, creo que puede repetir resultados, pero podría filtrarse fácilmentefuente
Puede canalizarlo
find
en un orden que se clasifica principalmente por el número de/
caracteres en el nombre de ruta. Por ejemplo,Esto se usa
awk
para prefijar el nombre de ruta con el número de barras ysed
para 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,4
hasta 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