Ordem de classificação de ordem natural do Windows Explorer

1

Estou meio entranhado com a ordem de classificação do Windows na minha cabeça. Infelizmente, o Windows não permite uma maneira fácil de alterá-lo.

Existe uma maneira de emular essa ordem de classificação usando ferramentas unix?

Um exemplo, se cada um for um nome de arquivo

{"Ie4 01", "Ie4!01", "Ie4_01", "Ie4_128", "Ie5", "Ie6", "Ie401sp2","Ie501sp2"}

ordem de classificação correta

Ie4 01
Ie4!01
Ie4_01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
    
por William 26.09.2018 / 01:13

3 respostas

1

A classificação da versão do tipo GNU ( -V ) parece fornecer essa saída:

~ printf "%s\n" "Ie5" "Ie6" "Ie4 01" 'Ie4!01' "Ie4_01" "Ie4_128" "Ie401sp2" "Ie501sp2" |
  sort -V
Ie4 01
Ie4!01
Ie4_01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
    
por 26.09.2018 / 01:19
1

Caso alguém queira separar pastas e arquivos como o Windows, você pode fazer isso:

ls -d */ -1 | sort -V
ls -p | grep -v / | sort -V
    
por 26.09.2018 / 01:41
0

Se você não for específico em relação à classificação dos caracteres especiais, o qualificador de classificação numérica de zsh ficará próximo:

Configuração

$ touch "Ie5" "Ie6" "Ie4 01" 'Ie4!01' "Ie4_01" "Ie4_128" "Ie401sp2" "Ie501sp2"
$ mkdir Foo Quux Ie7bar

somente zsh

$ print -l *(n/) *(n^/)
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2

com ls

$ ls -1df *(n/) *(n^/)
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2

Os sinalizadores para ls são:

  • forçar a saída de uma coluna ( -1 ) - simplesmente para facilitar a visualização
  • não desça aos diretórios ( -d )
  • não classifica a lista de entrada ( -f ou -U )

Os qualificadores do zsh glob dizem:

  • *(n/) - expande para a lista de diretórios / , ordenada numericamente
  • *(n^/) - expande para a lista de itens que não são ^ diretórios, ordenados numericamente

Eu menciono uma solução zsh apenas porque você pode manipular os resultados com mais facilidade, sem ter que se preocupar em citar nomes de arquivos ou delimitá-los com nulos. Por exemplo:

$ mine=( *(/n) *(n^/) )
$ for file in "${mine[@]}"; do print -l "$file"; done
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
$ print -l "${mine[-1]}"
Ie501sp2
    
por 26.09.2018 / 19:22

Tags