
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.gif
entã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
.