Listar arquivos classificados de acordo com o índice específico

2

Eu tenho um diretório de arquivos. Há uma linha em cada arquivo que diz:

# order: N

onde N é um número inteiro. Eu quero listar todos os arquivos no diretório (ou incluí-los no script wrapper) de acordo com esse número. Isto é possível a partir de uma linha de comando bash?

    
por user1371264 29.11.2017 / 17:18

3 respostas

4

Com o GNU grep e assumindo que os nomes de arquivos não contenham caracteres de cólon 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
    
por 29.11.2017 / 17:27
2

Com um único processo GNU awk :

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

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 depois usá-lo por exemplo com:

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

ou

sorted_file_list=(*(.no+byOrder))

(também adicionando um . ao qualificador glob para considerar apenas arquivos regulares (não diretórios, fifos, links simbólicos ...)).

    
por 29.11.2017 / 17:49

Tags