Lors du tri des noms de fichiers, ls
ignore les caractères comme -,_
. Je m'attendais à ce qu'il utilise également ces caractères dans le tri.
Un exemple:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Affichez maintenant ces fichiers avec ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
Je m'attendais à quelque chose comme ça:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
c'est-à-dire que je m'attendais à ce que les caractères non alphanumériques soient pris en compte lors du tri.
Quelqu'un peut-il expliquer ce comportement? Ce comportement est-il imposé par une norme? Ou est-ce dû au fait que l'encodage est UTF-8?
Mise à jour: Il semble que cela soit lié au tri 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
?[_-,.]
sont regroupés et en quelque sorte semi-ignorés. Je ne sais pas exactement comment ou où une telle collecte est définie, mais il doit être un problème de classement, parce que tout simplement, et seulement, en changeant la collation C (viaLC_COLLATE=C ls -l
) est suffisant pour vous donner l'ordre de tri que vous attendiez ( en supposant queLC_ALL
est pas prioritaireLC_COLLATE
). Cela est vrai pour toute la gamme de caractères dans le plan multilingue de base Unicode ... J'ai modifié ma réponse pour inclure un exemple de script quiRéponses:
Cela n'a rien à voir avec le jeu de caractères. C'est plutôt le langage qui détermine l'ordre de classement. La libc examine le langage présenté dans
$LC_COLLATE
/$LC_ALL
/$LANG
et recherche ses règles de classement (par exemple/usr/share/i18n/locales/*
pour GLibC) et ordonne le texte comme indiqué.la source
strcoll
par exemple, vous verriez que quelque chose commeaasa.c
serait trié ci-dessusaas.c
.EDIT: Test ajouté pour les données triées avec LC_COLLATE = C
La séquence d'assemblage par défaut traite ces caractères de "type ponctuation" comme étant de valeur égale ..
Use LC_COLLATE=C
pour les traiter dans l'ordre des points de code ..Sortie
Le code suivant teste tous les caractères UTF-8 valides dans le plan multilingue de base (sauf pour \ x00 et \ x0a ; pour plus de simplicité)
Il compare un fichier dans une séquence ascendante connue (générée), avec ce fichier trié aléatoirement puis trié à nouveau avec LC_COLLATE = C. Le résultat montre que la séquence C est identique à la séquence générée d'origine.
Sortie:
la source
a_1 a2 a_2
serait impossible.tree
je le pense, il y a plus dans l'histoire, comme la ponctuation supprimée des chaînes de comparaison ou quelque chose comme ça. Je peux dire que le/
caractère doit être défini comme le caractère le plus bas de la séquence d'assemblage, quoi qu'il en soit.