Listar arquivos classificados de acordo com linha específica de conteúdo

Listar arquivos classificados de acordo com linha específica de conteúdo

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 GNUawkprocesso:

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...)).

informação relacionada