Bestellung von Dateinamen unter Linux - nicht rein lexikografisch?

1

Bei einigen Dateien in einem Verzeichnis dataliefert der folgende Befehl ls ein überraschendes Ergebnis in der Art, wie sie sortiert sind:

for f in data/*; do echo $f;  done


data/CitiesBaselineCounts2015010520150112.49.csv
data/CitiesBaselineCounts2015010520150112.4.csv
data/CitiesBaselineCounts2015010520150112.50.csv
data/CitiesBaselineCounts2015010520150112.5.csv
data/CitiesBaselineCounts2015010520150112.6.csv
data/CitiesBaselineCounts2015010520150112.7.csv
data/CitiesBaselineCounts2015010520150112.8.csv
data/CitiesBaselineCounts2015010520150112.9.csv
data/CitiesBaselineCounts2015010520150112.csv

Das .Zeichen ist ASCII 46-, das den Codes für alle Ziffern (48 bis 57) vorangeht.

Die Reihenfolge ist also nicht lexikografisch. Was sind die Regeln für die Sortierung durch den verwendeten lsBefehl?

Javadba
quelle
@DavidPostill Ok, das ist auch hilfreich (und ich werde es für diesen Fall verwenden) - aber beantwortet die lexikografische Reihenfolge nicht direkt.
Javadba

Antworten:

2

Wenn Sie for f in data/*die Aufzählung der Dateinamen durchführen, wird dies von Ihrer Shell und nicht von "ls" ausgeführt. Normalerweise werden Shells lexikografisch sortiert (Bash), aber sie können die Sortierreihenfolge Ihres LC_COLLATE-Gebietsschemas verwenden. Möglicherweise sortiert Ihre bestimmte Schale überhaupt nicht.

Verzeichniseinträge werden normalerweise nicht sortiert, dies hängt jedoch vom zugrunde liegenden Dateisystem ab. Verwenden Sie ls -fdiese Option, um ein Verzeichnis ohne Sortierung aufzulisten.

Wenn Sie sagen ls *, dass zuerst die Shell erweitert wird * und das Ergebnis möglicherweise sortiert wird, sortiert ls die Dateinamen erneut.

meuh
quelle
mit bash hier.
Javadba
Und welches Gebietsschema? Versuchen Sie es export LC_COLLATE=Cin Ihrem Skript. Die Dateinamen dürfen auch nicht ASCII sein, sondern zB in einer UTF8-Codierung.
15.
Dieser Export hat funktioniert. wow das war nicht intuitiv. Irgendeine Idee, warum das nicht das Standardverhalten ist?
Javadba
Internationalisierung ist eine große Sache, an die Nicht-Programmierer genau so arbeiten möchten, wie sie es in ihren Papierwörterbüchern gewohnt sind und so weiter. Es wurde viel Arbeit in Linux geleistet, um dies zu unterstützen. Es macht jedoch vielen einfachen Programmieraufgaben das Leben schwer, wie Sie sehen können. Ich setze immer LANG = C (und LC_COLLATE = C und alle anderen), um viele solche bizarren Probleme zu vermeiden.
meuh
1

ls, sort und Ihr Skript haben alle die gleiche Reihenfolge. Die lexikografische Reihenfolge basiert auf dem ASCII-Wert jeder Position, mit der Ausnahme, dass nicht-alphanumerische Zeichen ignoriert werden

ABC.
abc ..
ABC0
abc1
ABC_1
abc.1
abc..1
abc.1.4
abc.1..4
abc.1.5
abc2
abc ~ 2
abc_2
abc2
abc.2
abc # 2
abc% 2
ABC3
ABC4
abc4.1
abc4.2
abc49
abc_9
abca
abcA
abcc

In der Antwort auf Frage 631402 finden Sie weitere Informationen zum Deaktivieren des Gebietsschemas, mit dem Sie lexikografisch nach ASCII-Werten einschließlich Symbolen sortieren können

Terry L Anderson
quelle