Ao classificar nomes de arquivos, ls
ignora caracteres como -,_
. Eu esperava que ele usasse esses caracteres na classificação também.
Um exemplo:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Agora exiba esses arquivos com ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
O que eu esperava era algo assim:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
ou seja, eu esperava que os caracteres não alfanuméricos fossem levados em consideração ao classificar.
Alguém pode explicar esse comportamento? Esse comportamento é determinado por um padrão? Ou isso ocorre porque a codificação é UTF-8?
Atualização: Parece que isso está relacionado à classificação UTF-8:
$ LC_COLLATE=C ls -1
a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2
LC_COLLATE=C ls
?[_-,.]
estão sendo agrupados e de alguma forma semi-ignorados. Não sei exatamente como ou onde esse agrupamento é definido, mas deve ser um problema de agrupamento, porque simplesmente, e apenas, alterar o agrupamento para C (viaLC_COLLATE=C ls -l
) é suficiente para fornecer a ordem de classificação que você esperava (assumindo queLC_ALL
é não substituindoLC_COLLATE
). Isso vale para toda a gama de caracteres no Unicode Basic Multilingual Plane ... Eu editei a minha resposta para incluir um script de exemplo que confirma isso ...Respostas:
Isso não tem nada a ver com o conjunto de caracteres. Pelo contrário, é a linguagem que determina a ordem de intercalação. O libc examina o idioma apresentado em
$LC_COLLATE
/$LC_ALL
/$LANG
e/usr/share/i18n/locales/*
consulta suas regras de agrupamento (por exemplo, para GLibC) e ordena o texto conforme indicado.fonte
strcoll
por exemplo, você veria que algo comoaasa.c
seria classificado acimaaas.c
.EDIT: teste adicionado para dados classificados com LC_COLLATE = C
A sequência de intercalação padrão é tratar esses caracteres "do tipo pontuação" como sendo de igual valor ..
Use LC_COLLATE=C
para tratá-los na ordem do ponto de código.Saída
O código que se segue testa todos válidos UTF-8 caracteres no básica multilingues plana (excepto para \ x00 e \ x0a ; para simplicidade)
Compara um ficheiro num (gerado) sequência ascendente conhecida, contra esse ficheiro ordenados aleatoriamente e então classificados novamente com LC_COLLATE = C. O resultado mostra que a sequência C é idêntica à sequência gerada original.
Saída:
fonte
a_1 a2 a_2
seria impossível.tree
que eu acho, acho que há mais na história, como a pontuação sendo removida das seqüências de comparação ou algo assim. Posso dizer que o/
caractere deve ser definido como o caractere mais baixo na sequência de intercalação, não importa o que mais.