opción de amplitud en la utilidad de Linux 'find'?

12

¿Hay alguna opción de amplitud primero / profundidad primero en la utilidad 'find' de Linux?

Xiè Jìléi
fuente

Respuestas:

5

No hay nada incorporado para encontrar, incluso GNU find. Puede postprocesar la salida de findordenar por número de barras, por ejemplo con Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> es la lista de todas las líneas de entrada;
  • $a =~ s!/!/!ges el número de barras inclinadas $aque usamos como criterio de clasificación.

Si puedes usar zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* enumera todos los archivos en el directorio y subdirectorios actuales.
  • Lo que está dentro de los paréntesis es un calificador global.
  • El calificador global oecontrola el orden en el que se devuelven las coincidencias: se ordenan por el valor de REPLYdespués de ejecutar el código aquí entre comillas para cada coincidencia que REPLYse establece inicialmente en la ruta coincidente.
  • Dicho código se transforma $REPLYpara eliminar todo excepto las barras. Entonces, el resultado consiste en todo en la profundidad 1 (resultado vacío $REPLY), luego todo en la profundidad 2 ( $REPLYtermina siendo /), profundidad 3 ( //), etc.
Gilles 'SO- deja de ser malvado'
fuente
1
El proceso de clasificación posterior es muy interesante, sin embargo, la clasificación necesita que se complete el hallazgo, y no tendrá la oportunidad de controlar el descanso.
Xiè Jìléi
1

Mi sensación es que puedes. Involucra grep y tal y un bucle, pero creo que funciona muy bien, específicamente para su caso sobre el hallazgo que no necesita completarse.

Requiere más recursos debido a:

  • Mucha bifurcación
  • Muchos hallazgos
  • Cada directorio antes de la profundidad actual es alcanzado por encontrar tantas veces como haya profundidad total en la estructura del archivo (esto no debería ser un problema si tiene prácticamente cualquier cantidad de ram ...)

Esto es bueno porque:

  • Utiliza bash y herramientas básicas de GNU
  • Puede romperse cuando lo desee (como si viera lo que estaba buscando)
  • Funciona por línea y no por búsqueda, por lo que los comandos posteriores no tienen que esperar para encontrar y ordenar
  • Funciona en función de la separación real del sistema de archivos, por lo que si tiene un directorio con una barra inclinada, no aparecerá en una lista más profunda de lo que es; si tiene un separador de ruta diferente configurado, todavía está bien.
#! / bin / bash 
profundidad = 0

mientras que encuentra -mindepth $ depth -maxdepth $ depth | grep '.'
hacer
    profundidad = $ ((profundidad + 1))
hecho

También puede ajustarlo en una línea bastante (?) Fácilmente:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Pero prefiero pequeños guiones sobre escribir ...

ChoqueEl Conejito
fuente