Lista de archivos ordenados según una línea específica de contenido

Lista de archivos ordenados según una línea específica de contenido

Tengo un directorio de archivos. Hay una línea en cada archivo que dice:

# order: N

donde N es un número entero. Quiero enumerar todos los archivos en el directorio (o incluso incluirlos en un script contenedor) de acuerdo con ese número N. ¿Es esto posible desde una línea de comandos de bash?

Respuesta1

Con GNU grep, y suponiendo que los nombres de archivos no contengan dos puntos o caracteres de nueva línea:

$ ls
bar     baz     foo     freeble quux
$ cat ./*
# order: 3
# order: 2
# order: 1
# order: 4
# order: 5
$ grep -m1 -EH '^# order: [0-9]+$' ./* | sort -n -k3 | cut -d: -f1
foo
baz
bar
freeble
quux

Respuesta2

Con un solo GNUawkproceso:

awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_asc" }
     /order: [0-9]+/{ a[FILENAME]=$NF; nextfile }
     END{ for(i in a) print i }' ./*

Respuesta3

Con zsh, puede definir un orden de clasificación global basado en el contenido de esas líneas con:

byOrder() REPLY=$(grep '^# order:' < $REPLY)

y luego usarlo por ejemplo con:

printf '%s\n' *(.no+byOrder)

o

sorted_file_list=(*(.no+byOrder))

(también agregando a .al calificador global para considerar soloregulararchivos (no directorios, fifos, enlaces simbólicos...)).

información relacionada