In allen Shells werden Globs standardmäßig sortiert. Sie wurden bereits von dem /etc/glob
Helfer von Ken Thompsons Shell aufgerufen, um Globs in der ersten Version von Unix in den frühen 70ern zu erweitern (und die Globs ihren Namen gaben).
Für sh
POSIX ist es erforderlich strcoll()
, dass die Sortierung anhand der Sortierreihenfolge im Gebietsschema des Benutzers erfolgt, wie dies bei ls
einigen noch immer der Fall strcmp()
ist und nur auf Byte-Werten basiert.
$ dash -c 'echo *'
Log01B log-0D log00 log01 log02 log0A log0B log0C log4E log4F log50 log① log② lóg01
$ bash -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ zsh -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls
log② log① log00 log01 lóg01 Log01B log02 log0A log0B log0C log-0D log4E log4F log50
$ ls | sort
log②
log①
log00
log01
lóg01
Log01B
log02
log0A
log0B
log0C
log-0D
log4E
log4F
log50
Sie werden vielleicht bemerken, dass für die Shells, die nach dem Gebietsschema sortieren, hier auf einem GNU-System mit einem en_GB.UTF-8
Gebietsschema, der -
in den Dateinamen für die Sortierung ignoriert wird (die meisten Interpunktionszeichen würden). Die ó
Sortierung erfolgt erwartungsgemäßer (zumindest für die Briten), und die Groß- und Kleinschreibung wird ignoriert (außer wenn es um die Entscheidung über eine Bindung geht).
Sie werden jedoch einige Inkonsistenzen für log① log② feststellen. Das liegt daran, dass die Sortierreihenfolge von ① und ② nicht in GNU-Gebietsschemata definiert ist (derzeit; hoffentlich wird sie eines Tages behoben). Sie sortieren gleich, so dass Sie zufällige Ergebnisse erhalten.
Das Ändern des Gebietsschemas wirkt sich auf die Sortierreihenfolge aus. Sie können das Gebietsschema auf C setzen, um eine strcmp()
ähnliche Sortierung zu erhalten:
$ bash -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ bash -c 'LC_ALL=C; echo *'
Log01B log-0D log0.2 log00 log01 log02 log0A log0B log0C log4E log4F log50 log① log② lóg01
Beachten Sie, dass einige Gebietsschemas auch für reine ASCII-Zeichenfolgen zu Verwirrungen führen können. Wie die tschechischen (zumindest auf GNU-Systemen), wo ch
sich ein Sortierelement befindet, das nach Folgendem sortiert h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Oder, wie von @ninjalj hervorgehoben, noch seltsamere in ungarischen Gegenden:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
In zsh
können Sie die Sortierung mit Glob-Qualifiern wählen . Zum Beispiel:
echo *(om) # to sort by modification time
echo *(oL) # to sort by size
echo *(On) # for a *reverse* sort by name
echo *(o+myfunction) # sort using a user-defined function
echo *(N) # to NOT sort
echo *(n) # sort by name, but numerically, and so on.
Die numerische Sortierung echo *(n)
kann auch global mit der numericglobsort
Option aktiviert werden :
$ zsh -c 'echo *'
log① log② log00 log01 lóg01 Log01B log02 log0.2 log0A log0B log0C log-0D log4E log4F log50
$ zsh -o numericglobsort -c 'echo *'
log① log② log00 lóg01 Log01B log0.2 log0A log0B log0C log01 log02 log-0D log4E log4F log50
Wenn Sie (wie ich) in diesem speziellen Fall (hier unter Verwendung meines britischen Gebietsschemas) durch diese Anweisung verwirrt sind, finden Sie hier weitere Informationen.
sort
ist dieselbe wie für die Shell, wenn ein Dateinamen-Globbing-Muster erweitert wird.