すべてのシェルで、globはデフォルトでソートされます。彼らはすでに、/etc/glob
ケントンプソンのシェルによって呼び出されたヘルパーによって、 70年代初頭のUnixの最初のバージョンでグロブを展開していました(そして、グロブに名前を付けました)。
の場合sh
、POSIXではstrcoll()
を使用してソートする必要があります。これは、ユーザーのロケールでのソート順を使用しているためls
ですstrcmp()
。
$ 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
あなたは、ロケールに基づいてソートないそれらの殻のために、ここでのGNUシステム上のことの上に気づくかもしれen_GB.UTF-8
ロケール、-
ファイル名には、(ほとんどの句読点文字をだろう)ソートでは無視されます。ó
(少なくとも英国人への)より期待される方法でソートされ、そして場合は、(それが絆を決定するために来るときを除く)は無視されます。
ただし、log①log②にはいくつかの矛盾があります。これは、GNUロケールで①と②のソート順が定義されていないためです(現在、いつか修正されることを期待しています)。それらは同じようにソートされるため、ランダムな結果が得られます。
ロケールを変更すると、ソート順に影響します。ロケールをCに設定して、strcmp()
-likeソートを取得できます。
$ 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
一部のロケールでは、すべてASCIIのall-alnum文字列であっても混乱が生じる可能性があることに注意してください。チェコ語(少なくともGNUシステム)のようch
に、次のようにソートする照合要素がありh
ます:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
または、@ ninjaljが指摘したように、ハンガリー語のロケールではさらに奇妙なもの:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
ではzsh
、glob修飾子を使用してソートを選択できます。例えば:
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.
次のオプションをecho *(n)
使用して、数値の並べ替えをグローバルに有効にすることもできnumericglobsort
ます。
$ 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
あなたが(私がそうであったように)その特定のインスタンス(ここでは私の英国のロケールを使用)でその順序に混乱している場合、詳細についてはこちらを参照してください。
sort
は、ファイル名のグロビングパターンを展開しているときのシェルのソート順と同じです。