Saya suka bisa memberi nama file dan direktori dengan awalan garis bawah jika itu adalah sesuatu yang ingin saya pisahkan dari file dan direktori lain pada level yang sama. Pada Windows dan Mac, misalnya, mengawali file dengan garis bawah mengurutkannya ke atas, di depan file yang dimulai dengan karakter alfanumerik.
Googling saya telah menemukan bahwa itu ada hubungannya dengan LC_COLLATE dan lokal saya saat ini (en_US). Tidak apa-apa, meskipun saya benar-benar tidak mengerti mengapa en_US tidak seperti yang diharapkan.
Berdasarkan pengaturan situs demonstrasi ICU Collate lokal ke en_US_POSIX tentu saja tampaknya memiliki urutan semacam yang saya cari (Anda harus mengedit data sampel dan menambahkan beberapa garis bawah untuk mengujinya). Tapi saya tidak benar-benar melihat bagaimana menerapkan ini di shell Linux saya.
Idealnya, saya ingin dapat mengatur sesuatu dalam konfigurasi bash saya sehingga selalu mengurutkan garis bawah terlebih dahulu. Bagaimana saya bisa melakukan ini?
Jawaban:
Jika Anda tidak
ls
dapat mengurutkan seperti yang Anda inginkan, coba ekspansi shell.Anda dapat menggunakan pola nama file untuk dijalankan
ls
dengan daftar file yang sudah diurutkan shell, melewati metode yangls
digunakan.Dengan asumsi Anda memiliki file
ini seperti berlari
Penjelasan:
_*
adalah pola shell yang cocok dengan nama file yang dimulai dengan garis bawah, diperluas dalam urutan abjad.[!_]*
cocok dengan nama file apa pun yang tidak dimulai dengan garis bawah, diperluas dalam urutan alfabet.-f
mengatakanls
untuk tidak mengurutkan, karena shell sudah melakukannya.Informasi lebih lanjut: ekspansi nama file bash
Jika ada direktori di direktori saat ini Anda ingin menjalankan perintah seperti ini untuk menghindari daftar file dalam direktori:
sumber
_
untuk membuat file tampil pertama adalah hack khusus-OS; dan versi unix dari peretasan ini adalah memulai nama file dengan huruf besar: konvensi unix standar adalah dengan hanya menggunakan huruf kecil dalam nama file.00README
.-f
mengatakanls
untuk tidak melakukan penyortiran sendiri, sehingga menampilkan argumen dalam urutan mereka berlalu. Hasil dari setiap ekspansi wildcard shell_*
dan[!_]*
merupakan daftar yang diurutkan secara leksikografis.ls
diurutkan (dalam dua kelompok: yang dimulai dengan_
, kemudian yang lain) ketika dihasilkan oleh shell. Berlariecho ls -lf _* [!_]*
untuk melihat apa yang terjadi. The-f
bendera mengatakanls
untuk tidak melakukan penyortiran apapun.Jika Anda tidak ingin mencampur huruf kecil dan besar, atur lokal Anda ke
C
, yang mengambil karakter dalam urutan numerik mereka._
jatuh di antara huruf besar dan kecil.Pengaturan lokal
LC_MESSAGES
(bahasa pesan kesalahan),LC_CTYPE
(set karakter) danLC_TIME
(format tanggal dan waktu) sangat berguna.LC_COLLATE
danLC_NUMERIC
biasanya lebih banyak masalah daripada nilainya, saya tidak menyarankan untuk mengaturnya. Penyortiran leksikografis yang tepat lebih rumit daripadaLC_COLLATE
yang seharusnya ditentukan, dan ini dapat menyebabkan semua jenis perilaku aneh ketika Anda menggunakan rentang karakter dalam ekspresi reguler.LC_NUMERIC
sebagian besar kosmetik, kecuali ketika ada sesuatu yang salah karena beberapa program menghasilkan angka dengan pemisah desimal selain.
.sumber
VAR=value cmd
setVAR
untukvalue
hanya di lingkungancmd
dan tidak menyentuh nilai (atau tidak adanya nilai) di shell mana Anda menjalankannya. Untuk membuat garis bawah muncul sebelum huruf besar, Anda perlu menentukan pengaturan lokal Anda sendiri. Ini mungkin, tetapi canggung untuk digunakan, karena setidaknya di Linux, perpustakaan standar hanya mencari definisi lokal di/usr/lib/locale
- tidak ada~/.locale
atau variabel lingkungan di mana Anda bisa meletakkanen_tom
pengaturan Anda .ls
perintah, pergi dengan saran Mikel .Sayangnya Linux menggunakan glibc untuk info lokalnya, bukan ICU, jadi tidak ada cara untuk langsung menerapkan ini ke Linux tanpa mengeluarkan banyak upaya baik perkuatan ICU ke glibc atau menambah info lokal di glibc.
sumber
Menambahkan
-f
sakelar (tanpa sortasi) membuatnya tampil seperti itu untuk saya.man ls
sumber
touch 3 1 _1 _3 2 _2 && ls -fl
keluaran2 . 1 3 _2 _3 .. _1