Di semua shell, gumpalan diurutkan secara default. Mereka sudah oleh /etc/glob
pembantu yang dipanggil oleh shell Ken Thompson untuk memperluas gumpalan di versi pertama Unix di awal 70-an (dan yang memberi gumpalan nama mereka).
Sebab sh
, POSIX memang mengharuskan mereka untuk disortir dengan cara strcoll()
, yaitu menggunakan urutan penyortiran di lokal pengguna, seperti ls
meskipun beberapa masih melakukannya melalui strcmp()
, yang didasarkan pada nilai byte saja.
$ 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
Anda mungkin memperhatikan di atas bahwa untuk shell yang melakukan pengurutan berdasarkan lokal, di sini pada sistem GNU dengan en_GB.UTF-8
lokal, -
dalam nama file diabaikan untuk pengurutan (kebanyakan karakter tanda baca akan). The ó
diurutkan dengan cara yang lebih diharapkan (setidaknya untuk orang-orang Inggris), dan kasus diabaikan (kecuali ketika datang untuk memutuskan ikatan).
Namun, Anda akan melihat beberapa inkonsistensi untuk log① log②. Itu karena urutan penyortiran ① dan ② tidak didefinisikan di lokal GNU (saat ini; semoga akan diperbaiki suatu hari). Mereka mengurutkan sama, sehingga Anda mendapatkan hasil acak.
Mengubah lokal akan memengaruhi urutan pengurutan. Anda dapat mengatur lokal ke C untuk mendapatkan strcmp()
semacam-seperti:
$ 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
Perhatikan bahwa beberapa lokal dapat menyebabkan beberapa kebingungan bahkan untuk string all-ASCII all-alnum. Seperti yang berbahasa Ceko (setidaknya pada sistem GNU) di mana ch
ada elemen penyusun yang berurutan h
:
$ LC_ALL=cs_CZ.UTF-8 bash -c 'echo *'
log0Ah log0Bh log0Dh log0Ch
Atau, seperti yang ditunjukkan oleh @ninjalj, bahkan yang lebih aneh di lokal Hongaria:
$ LC_ALL=hu_HU.UTF-8 bash -c 'echo *'
logX LOGx LOGX logZ LOGz LOGZ logY LOGY LOGy
Di zsh
, Anda dapat memilih penyortiran dengan kualifikasi glob . Misalnya:
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.
Jenis numerik echo *(n)
juga dapat diaktifkan secara global dengan numericglobsort
opsi:
$ 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
Jika Anda (seperti saya) bingung dengan urutan itu dalam contoh tertentu (di sini menggunakan bahasa Inggris saya), lihat di sini untuk detailnya.
sort
sama dengan yang untuk shell ketika itu memperluas pola globbing nama file.