Dans tous les shells, les globs sont triés par défaut. Ils étaient déjà par l' /etc/glob
assistant appelé par la coquille de Ken Thompson pour développer des globs dans la première version d'Unix au début des années 70 (et qui a donné leur nom à globs).
En effet sh
, POSIX exige qu’ils soient triés par le biais de strcoll()
l’ordre de tri dans les paramètres régionaux de l’utilisateur, comme c’est le cas pour ls
certains, mais strcmp()
uniquement via les valeurs d’octets.
$ 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
Vous remarquerez peut-être ci-dessus que pour les shells qui effectuent un tri en fonction de la locale, ici sur un système GNU avec une en_GB.UTF-8
locale, le -
nom des fichiers est ignoré pour le tri (la plupart des caractères de ponctuation le seraient). Le ó
est trié de manière plus attendue (au moins pour les Britanniques), et le cas est ignoré (sauf quand il s'agit de décider des liens).
Cependant, vous remarquerez des incohérences dans log① log②. En effet, l'ordre de tri de et n'est pas défini dans les paramètres régionaux GNU (actuellement; espérons-le, il sera corrigé un jour). Ils trient la même chose, vous obtenez donc des résultats aléatoires.
Changer les paramètres régionaux affectera l'ordre de tri. Vous pouvez définir les paramètres régionaux sur C pour obtenir un strcmp()
tri de type:
$ 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
Notez que certains paramètres régionaux peuvent causer des confusions, même pour les chaînes tout-ASCII tout-alnum. Comme les Tchèques (du moins sur les systèmes GNU) où se ch
trouve un élément de classement qui trie après h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Ou, comme l'a souligné @ninjalj, même les plus bizarres dans les localités hongroises:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
Dans zsh
, vous pouvez choisir le tri avec les qualificatifs glob . Par exemple:
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.
Le tri numérique echo *(n)
peut également être activé globalement avec l' numericglobsort
option:
$ 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
Si vous (comme j’étais) confus par cet ordre dans ce cas particulier (ici, en utilisant mes paramètres régionaux britanniques), cliquez ici pour plus de détails.
sort
est le même que celui utilisé pour le shell lorsqu'il étend un modèle de définition de nom de fichier.