Saat menyortir nama file, ls
abaikan karakter suka -,_
. Saya berharap untuk menggunakan karakter-karakter itu dalam menyortir juga.
Sebuah contoh:
touch a1 a2 a-1 a-2 a_1 a_2 a.1 a.2 a,1 a,2
Sekarang tampilkan file-file ini dengan ls -1
:
a1
a_1
a-1
a,1
a.1
a2
a_2
a-2
a,2
a.2
Apa yang saya harapkan adalah seperti ini:
a1
a2
a,1
a,2
a.1
a.2
a_1
a_2
a-1
a-2
yaitu saya berharap karakter non-alfanumerik diperhitungkan saat menyortir.
Adakah yang bisa menjelaskan perilaku ini? Apakah perilaku ini diamanatkan oleh standar? Atau ini karena pengkodean menjadi UTF-8?
Pembaruan: Tampaknya ini terkait dengan pengurutan UTF-8:
$ LC_COLLATE=C ls -1
a,1
a,2
a-1
a-2
a.1
a.2
a1
a2
a_1
a_2
LC_COLLATE=C ls
?[_-,.]
sedang dikelompokkan dan entah bagaimana semi-diabaikan. Saya tidak tahu persis bagaimana atau di mana pemeriksaan tersebut didefinisikan, tetapi harus menjadi masalah pemeriksaan, karena sederhana, dan hanya, mengubah pemeriksaan ke C (melaluiLC_COLLATE=C ls -l
) cukup untuk memberikan urutan yang Anda harapkan (dengan asumsiLC_ALL
adalah tidak mengesampingkanLC_COLLATE
). Ini berlaku untuk seluruh jajaran karakter di Unicode Basic Multilingual Plane ... Saya telah mengedit jawaban saya untuk menyertakan contoh skrip yang menghasilkan ini ...Jawaban:
Ini tidak ada hubungannya dengan charset. Sebaliknya, itu adalah bahasa yang menentukan urutan susunan. Libc memeriksa bahasa yang disajikan dalam
$LC_COLLATE
/$LC_ALL
/$LANG
dan mencari aturan/usr/share/i18n/locales/*
susunannya (misalnya untuk GLibC) dan memerintahkan teks sesuai petunjuk.sumber
strcoll
misalnya, Anda akan melihat bahwa sesuatu sepertiaasa.c
akan diurutkan di atasaas.c
.EDIT: Uji tambah untuk data yang diurutkan dengan LC_COLLATE = C
Urutan susunan default memperlakukan karakter "tipe tanda baca" tersebut memiliki nilai yang sama ..
Use LC_COLLATE=C
untuk memperlakukannya dalam urutan titik kode ..Keluaran
Kode berikut menguji semua karakter UTF-8 yang valid di Basic Multilingual Plane (kecuali untuk \ x00 dan \ x0a ; untuk kesederhanaan)
Ia membandingkan file dalam urutan naik (dikenal) yang diketahui, terhadap file yang diurutkan secara acak dan kemudian diurutkan lagi dengan LC_COLLATE = C. Hasilnya menunjukkan bahwa urutan C identik dengan urutan asli yang dihasilkan.
Keluaran:
sumber
a_1 a2 a_2
tidak akan mungkin.tree
melakukannya saya pikir ada lebih banyak cerita seperti tanda baca yang dihapus dari string perbandingan atau sesuatu seperti itu. Saya dapat mengatakan bahwa/
karakter harus ditetapkan sebagai karakter terendah dalam urutan susun, apa pun yang terjadi.