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
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
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
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:
$ touch "Ie5" "Ie6" "Ie4 01" 'Ie4!01' "Ie4_01" "Ie4_128" "Ie401sp2" "Ie501sp2"
$ mkdir Foo Quux Ie7bar
$ print -l *(n/) *(n^/)
Foo
Ie7bar
Quux
Ie4 01
Ie4_01
Ie4!01
Ie4_128
Ie5
Ie6
Ie401sp2
Ie501sp2
$ 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:
-1
) - simplesmente para facilitar a visualização -d
) -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
Tags sort