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 GNUawk
proceso:
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...)).