orden de clasificación predeterminada del comando find

30

¿Cuál es el orden de clasificación predeterminado para las entradas devueltas por el comando linux find?

Por ejemplo, si publico

find . -type f -name '*mp3' 

y la salida consta de varios archivos en varias subcarpetas, ¿cuál es el orden predeterminado en el que se enumeran los directorios? Al mismo tiempo, ¿cuál es el orden de clasificación en el que se enumeran los archivos dentro de un directorio individual?

A veces vuelve:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Vea cómo se enumera primero el contenido del directorio B, luego el del directorio A. Al mismo tiempo, dentro del directorio A, los archivos se enumeran en un orden divertido.

Nasko
fuente
Por experiencia parece ser consistente por instalación, es decir. Si tiene el mismo conjunto de archivos en dos máquinas, siempre devolverá un pedido en una máquina y uno completamente diferente en la otra. Me he preguntado por qué antes, +1
James L
1
Tengo un transmisor FM en mi automóvil y siempre reproduce canciones de mi tarjeta flash en un orden extraño. Nunca lo imaginé, pero reconocí que era exactamente el mismo orden en que el comando anterior devolvió su salida
Nasko
Por cierto: BSD find tiene un -sparámetro para ordenar alfabéticamente la salida.
lapo

Respuestas:

19

findatravesará el árbol del directorio en el orden en que los elementos se almacenan dentro de las entradas del directorio. Esto (en su mayoría) será coherente de una ejecución a otra, en la misma máquina y esencialmente será un "orden de creación de archivo / directorio" si no ha habido eliminaciones.

Sin embargo, algunos sistemas de archivos reordenarán las entradas del directorio como parte de las operaciones de compactación o cuando sea necesario expandir el tamaño de la entrada, por lo que siempre hay una pequeña posibilidad de que el orden "en bruto" cambie con el tiempo. Si desea un orden consistente, alimente la salida a través de una etapa de clasificación adicional.

Vatine
fuente
¡Gracias por tu respuesta detallada! Por lo tanto, si mi transmisor FM (ver mi comentario anterior) reproduce pistas en el orden en que el comando de búsqueda las enumerará, no puedo controlar en qué orden me gustaría que se reproduzcan.
Nasko
Bueno, la tarjeta flash probablemente usa un sistema de archivos FAT y, si no recuerdo mal, manipular el orden de las entradas FAT es bastante fácil con un depurador del sistema de archivos. Posiblemente, valga la pena copiar las canciones del flash actual en un flash nuevo, en el orden en que desea que se reproduzcan, eso puede ser más fácil.
Vatine
Una de las aplicaciones útiles de tal consistencia es una estimación del progreso de lento find /path/ -exec ...con una ejecución mucho más rápida find /path/para obtener primero una lista ordenada de archivos.
Andrey
6

No debe confiar en un orden de salida particular findy en su lugar debe usar sorty otros medios para controlar específicamente el orden.

Pausado hasta nuevo aviso.
fuente
2

He estado trabajando en UNIX / Linux desde 1984/1991 respectivamente y el primer comando que me enseñaron fue encontrar. Linux / GNU ha puesto casi todo lo que necesita en el comando de búsqueda actual, así que juegue con él.

Aquí hay algunos consejos útiles para ordenar la salida de búsqueda. La opción -printf le ofrece muchas opciones para permitir una clasificación más compleja y una presentación de información de archivo. Es lo mejor para problemas como este. Juega con él para ver qué funcionará para ti. Usando -printf puede personalizar y delimitar los resultados de la manera que desee. Esto ayuda bastante cuando necesita publicar el proceso de los resultados. Espero que esto ayude a alguien.

  1. Si usa -ls y desea ordenar por nombre de archivo, el campo 11 es el nombre del archivo para que pueda hacer lo siguiente. La opción sort -k también puede tomar múltiples campos para ordenar.

    encontrar / ruta -ls | ordenar -k11

  2. Si desea un control de grano más fino ordenado por fecha / hora en orden ascendente o descendente, use la opción -printf "". Consulte el manual para obtener más detalles, pero el siguiente es un ejemplo que se imprimirá con segundos fraccionarios, por lo que es muy preciso.

EJEMPLO FECHA / HORA: 2016-09-17 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Otra forma de hacerlo sin caracteres en la cadena de fecha / hora es.

EJEMPLO FECHA / HORA: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
David Conger-Eldeen
fuente