Al ordenar los nombres de archivo, ls
ignora los caracteres como -,_
. Esperaba que también usara esos caracteres en la clasificación.
Un ejemplo:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Ahora muestre estos archivos con ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
Lo que esperaba era algo como esto:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
es decir, esperaba que los caracteres no alfanuméricos se tengan en cuenta al ordenar.
¿Alguien puede explicar este comportamiento? ¿Es este comportamiento obligatorio por un estándar? ¿O esto se debe a que la codificación es UTF-8?
Actualización: Parece que esto está relacionado con la clasificación 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án siendo agrupados y de alguna manera semi-ignorados. No sé exactamente cómo o dónde se define dicha clasificación, pero debe ser un problema de clasificación, porque simplemente, y solo, cambiar la clasificación a C (víaLC_COLLATE=C ls -l
) es suficiente para darle el orden de clasificación que esperaba (suponiendo queLC_ALL
es no anulandoLC_COLLATE
). Esto es válido para toda la gama de caracteres en el plano multilingüe básico Unicode ... He editado mi respuesta para incluir un script de ejemplo que loRespuestas:
Esto no tiene nada que ver con el juego de caracteres. Más bien, es el lenguaje el que determina el orden de clasificación. La biblioteca examina el lenguaje presentado en
$LC_COLLATE
/$LC_ALL
/$LANG
y busca sus reglas de clasificación (por ejemplo,/usr/share/i18n/locales/*
para GLibC) y ordena el texto según las instrucciones.fuente
strcoll
por ejemplo, vería que algo así seaasa.c
ordenaría arribaaas.c
.EDITAR: Prueba agregada para datos ordenados con LC_COLLATE = C
La secuencia de clasificación predeterminada es tratar esos caracteres de "tipo de puntuación" como de igual valor ...
Use LC_COLLATE=C
para tratarlos en orden de punto de código ...Salida
El siguiente código prueba todos los caracteres UTF-8 válidos en el plano multilingüe básico (excepto \ x00 y \ x0a ; por simplicidad)
Compara un archivo en una secuencia ascendente conocida (generada), contra ese archivo ordenado aleatoriamente y luego ordenado nuevamente con LC_COLLATE = C. El resultado muestra que la secuencia C es idéntica a la secuencia original generada.
Salida:
fuente
a_1 a2 a_2
sería imposible.tree
, creo que hay más en la historia, como la eliminación de la puntuación de las cadenas de comparación o algo así. Puedo decir que el/
carácter tiene que establecerse como el carácter más bajo en la secuencia de clasificación sin importar qué más.