Bei einigen Dateien in einem Verzeichnis data
liefert 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 ls
Befehl?
Antworten:
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 -f
diese 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.quelle
export LC_COLLATE=C
in Ihrem Skript. Die Dateinamen dürfen auch nicht ASCII sein, sondern zB in einer UTF8-Codierung.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
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
quelle