Classificação de diretórios e arquivos

3

Eu quero usar find e classificar a resposta. Eu assumi que um simples pipe find ... | sort faria isso, mas o comportamento de ordenação é estranho. Por simplicidade, um arquivo de texto simples:

asdf/2/22
asdf/2/01
asdf/20/0
asdf/20/1

Meu resultado esperado seria

asdf/2/01
asdf/2/22
asdf/20/0
asdf/20/1

ou

asdf/20/0
asdf/20/1
asdf/2/01
asdf/2/22

Não importa, pois só quero que os diretórios apareçam em grupos.

Aqui estão minhas tentativas:

[root@linux6 ~]# cat sort_test | sort
asdf/20/0
asdf/2/01
asdf/20/1
asdf/2/22
[root@linux6 ~]# cat sort_test | sort -d
asdf/20/0
asdf/2/01
asdf/20/1
asdf/2/22
[root@linux6 ~]# cat sort_test | tr "/" "X" | sort
asdfX20X0
asdfX20X1
asdfX2X01
asdfX2X22
[root@linux6 ~]# cat sort_test | tr "/" "_" | sort
asdf_20_0
asdf_2_01
asdf_20_1
asdf_2_22
[root@linux6 ~]#

Observe que isso só funciona com "X". Qualquer caractere não alfanumérico parece interromper a saída. Eu também tentei as opções -s , -t '/' sem nenhuma alteração na saída.

sort parece remover primeiro os caracteres não alfanuméricos e depois ordenar a linha mesmo que eu não tenha mencionado -d . Não há alias para classificação.

[root@linux6 ~]# which sort
/usr/bin/sort
[root@linux6 ~]# uname -a
Linux i-epg-appl1 3.10.0-229.14.1.el7.x86_64 #1 SMP Tue Sep 15 15:05:51 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@linux6 ~]# sort --version
sort (GNU coreutils) 8.22
    
por sjngm 17.03.2016 / 12:16

1 resposta

2

Em primeiro lugar, o / será ignorado em sua localidade para classificação (você notará que todos os pesos, exceto o último, na especificação da coleção para / é IGNORE em um sistema GNU para a maioria dos locais) <U002F> IGNORE;IGNORE;IGNORE;<U002F> # 45 / in /usr/share/i18n/locales/iso14651_t1_common no meu sistema Debian)), então classificar asdf/20/0 em relação a asdf/2/01 é como classificar asdf200 em relação a asdf201 , como se você tivesse usado -d .

Você pode alterar a localidade para C, onde a classificação é baseada somente no valor de byte (e / ordena antes dígitos), então asdf/2/01 classificaria antes de asdf/20/0 as / classifica antes de 0 , mas você ainda teria problemas com asdf/2 em relação a asdf/10 , por exemplo.

Aqui, você poderia usar a opção -g / --general-numeric-sort específica do GNU, ou você poderia fazer:

sort -nt/ -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 -k6,6 -k7,7 -k8,8 -k9,9

Para considerar cada componente do diretório como um número (que classificará 2_ antes

Com zsh , você pode fazer:

printf '%s\n' **/*(Dn)

para fazer um glob recursivo numericamente ordenado.

    
por 17.03.2016 / 12:58

Tags