Tüm kabuklarda, globler varsayılan olarak sıralanır. Onlar zaten,/etc/glob
70'li yılların başında (ve globlara isimlerini veren) Unix'in ilk versiyonunda globları genişletmek için Ken Thompson'ın kabuğunun çağırdığı yardımcınızdı .
Çünkü sh
POSIX strcoll()
, kullanıcı tarafından yerel ayarlarda sıralama düzenini kullanarak, yalnızca ls
hala strcmp()
byte değerlerine dayanan, yine de bazılarının yaptığı gibi, sıralama yapmalarını gerektirir .
$ 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
Bir bir GNU sistemi burada, yerel ayara dayalı sıralama yapmak o kabuklar için yukarıda görebilirsiniz en_GB.UTF-8
yerel ayarı, -
dosya adlarında (olur Çoğu noktalama işaretini) sıralamak için yok sayılır. ó
(En azından İngiliz halkına) daha beklenen şekilde sıralanır ve dava (bağlarını karar geldiğinde hariç) göz ardı edilir.
Ancak, log① log① için bazı tutarsızlıklar göreceksiniz. Bunun nedeni, ① ve the 'nın sıralama düzeninin GNU yerellerinde tanımlanmamış olmasıdır (şu anda; umarım bir gün sabitlenir). Aynısını sıralarlar, böylece rastgele sonuçlar elde edersiniz.
Yerel ayarların değiştirilmesi sıralama düzenini etkiler. strcmp()
Benzer bir sıralama elde etmek için yerel ayarı C olarak ayarlayabilirsiniz :
$ 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
Bazı yerel ayarların, tüm ASCII alnum dizeleri için bile bazı kafa karışıklıklarına neden olabileceğini unutmayın. Çekliler gibi (en azından GNU sistemlerinde) ch
aşağıdakileri sıralayan bir harmanlama öğesinin bulunduğu yer h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Ya da, @ ninjalj'ın belirttiği gibi, Macar yerlerinde tuhaf olanlar bile:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
İçinde zsh
, glob niteleyicileri ile sıralamayı seçebilirsiniz . Örneğin:
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.
Sayısal tür seçeneği echo *(n)
, aşağıdaki numericglobsort
seçeneklerle genel olarak da etkinleştirilebilir :
$ 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
Siz (olduğum gibi) bu sırada (buradaki İngiliz yerel ayarımı kullanarak) söz konusu sırayla karıştıysanız, ayrıntılar için buraya bakın.
sort
, bir dosya adı globbing desenini genişletirken kabuk ile aynıdır.