Por que o comando `ls` classifica os arquivos assim?

Por que o comando `ls` classifica os arquivos assim?

Enquanto tentava fazer engenharia reversa do comando ls, me deparei com um comportamento interessante. Quando eu crio 3 arquivos, foo.png, foopa.png, e fooqa.png, ls os classifica como foopa.png, foo.png, e fooqa.png. Também tentei usando a extensão .gif e parece que isso acontece quando p e q são substituídos pela primeira letra da extensão e pela próxima letra do alfabeto; então no caso de .gse fosse g e h. ( fooga.gif, Então foo.gifentão fooha.gif)

Por que ele ordena a saída dessa maneira?

Responder1

Depende da ordem de agrupamento da sua localidade:

>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png

>LANG=C ls -1 foo* 
foo.png
foopa.png
fooqa.png

Você também pode usar a variável LC_COLLATE em vez de LANG e usar o código de idioma POSIX em vez do C.

A ordem de agrupamento C é puramente alfabética (ordem ASCII). Outras ordens de agrupamento (como o inglês) podem considerar espaços e caracteres especiais, como pontos, como separadores e manipular "palavras" separadamente ou simplesmente ignorar esses separadores (o que parece ser o caso aqui).

Observe que a localidade não UTF-8 também classifica usando ASCII alfabético:

>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png

Depois de mais pesquisas, parece que ignorar a pontuação é uma característica comum de localidades compatíveis com Unicode, como essas *.UTF-8.

informação relacionada