Al ordenar los nombres de archivo, lsignora 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_ALLes 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/$LANGy busca sus reglas de clasificación (por ejemplo,/usr/share/i18n/locales/*para GLibC) y ordena el texto según las instrucciones.fuente
strcollpor ejemplo, vería que algo así seaasa.cordenarí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=Cpara 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_2serí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.