Eu tenho um diretório de arquivos. Há uma linha em cada arquivo que diz:
# order: N
onde N é um número inteiro. Quero listar todos os arquivos no diretório (ou até mesmo incluí-los no script wrapper) de acordo com esse número N. Isso é possível a partir de uma linha de comando do bash?
Responder1
Com GNU grep
, e assumindo que os nomes dos arquivos não contêm caracteres de dois pontos ou de nova linha:
$ 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
Responder2
Com único GNUawk
processo:
awk 'BEGIN{ PROCINFO["sorted_in"]="@val_num_asc" }
/order: [0-9]+/{ a[FILENAME]=$NF; nextfile }
END{ for(i in a) print i }' ./*
Responder3
Com zsh
, você pode definir uma ordem de classificação glob com base no conteúdo dessas linhas com:
byOrder() REPLY=$(grep '^# order:' < $REPLY)
e então use-o, por exemplo, com:
printf '%s\n' *(.no+byOrder)
ou
sorted_file_list=(*(.no+byOrder))
(também adicionando um .
ao qualificador glob para considerar apenasregulararquivos (não diretórios, fifos, links simbólicos...)).