ls
Ignoriert beim Sortieren von Dateinamen Zeichen wie -,_
. Ich hatte erwartet, dass diese Zeichen auch beim Sortieren verwendet werden.
Ein Beispiel:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Zeigen Sie diese Dateien nun an mit ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
Was ich erwartet hatte, war ungefähr so:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
Dh ich habe erwartet, dass die nicht alphanumerischen Zeichen beim Sortieren berücksichtigt werden.
Kann jemand dieses Verhalten erklären? Ist dieses Verhalten durch einen Standard vorgeschrieben? Oder liegt das daran, dass die Codierung UTF-8 ist?
Update: Es scheint, dass dies mit der UTF-8-Sortierung zusammenhängt:
$ 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
?[_-,.]
dass gruppiert und irgendwie teilweise ignoriert werden. Ich weiß nicht genau, wie oder wo eine solche Kollatierung definiert ist, aber es muss ein Kollatierungsproblem sein, da es ausreicht , die Kollatierung einfach und ausschließlich in C (ViaLC_COLLATE=C ls -l
) zu ändern , um Ihnen die erwartete Sortierreihenfolge zu geben (vorausgesetzt, diesLC_ALL
ist nicht überschreibenLC_COLLATE
). Dies gilt für den gesamten Bereich der Zeichen in der mehrsprachigen Unicode-Grundebene ... Ich habe meine Antwort so bearbeitet, dass sie ein Beispielskript enthält, das dies bestätigt ...Antworten:
Dies hat nichts mit dem Zeichensatz zu tun. Es ist vielmehr die Sprache, die die Sortierreihenfolge bestimmt. Die libc prüft die Sprache in präsentierten
$LC_COLLATE
/$LC_ALL
/$LANG
und sieht auf seine Sortierregeln (zB/usr/share/i18n/locales/*
für glibc) und Aufträge den Text , wie verwiesen.quelle
strcoll
zum Beispiel verwenden würde, würde man sehen, dass so etwasaasa.c
oben sortiert wäreaas.c
.EDIT: Test für mit LC_COLLATE = C sortierte Daten hinzugefügt
Die Standard-Sortierfolge behandelt diese "Interpunktionstyp" -Zeichen als gleichwertig
Use LC_COLLATE=C
, um sie in Codepunktreihenfolge zu behandeln.Ausgabe
Der folgende Code testet alle gültigen UTF-8-Zeichen in der mehrsprachigen Basisebene (mit Ausnahme von \ x00 und \ x0a ; zur Vereinfachung).
Er vergleicht eine Datei in einer bekannten (generierten) aufsteigenden Reihenfolge mit dieser Datei, die zufällig sortiert und dann erneut mit sortiert wird LC_COLLATE = C. Das Ergebnis zeigt, dass die C- Sequenz mit der ursprünglich erzeugten Sequenz identisch ist.
Ausgabe:
quelle
a_1 a2 a_2
würden, wäre die Sortierreihenfolge unmöglich.tree
gibt es meiner Meinung nach mehr an der Geschichte als die Interpunktion, die aus Vergleichszeichenfolgen entfernt wird, oder so etwas. Ich kann sagen, dass das/
Zeichen als das niedrigste Zeichen in der Sortierfolge festgelegt werden muss, egal was sonst.