Buat file berikut dalam direktori.
$ touch .a .b a b A B 你好嗎
ls
Pesanan default saya mengabaikan keberadaan titik-titik terkemuka, menggabungkannya dengan file-file lain.
$ ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Saya dapat mengubah LC_COLLATE
untuk menempatkan dotfiles pertama.
$ LC_COLLATE=C ls -Al
total 0
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 .b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 A
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 B
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 a
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:03 b
-rw-r--r-- 1 sparhawk sparhawk 0 Jun 8 17:06 你好嗎
Sayangnya ini membuat jenis urutan case-sensitive, yaitu A
dan B
mendahului a
dan b
. Apakah ada cara untuk mencetak dotfile terlebih dahulu sambil tetap case-sensitive ( A
dan a
mendahului B
dan b
)?
Sunting: mencoba mengubah LC_COLLATE
Tidak ada jawaban sejauh ini sepenuhnya meniru fungsi ls
dengan mudah. Dapat dibayangkan, saya bisa membungkus beberapa dari mereka dalam suatu fungsi, tetapi ini harus menyertakan beberapa kode rinci tentang (misalnya) cara bekerja tanpa argumen vs memasok direktori sebagai argumen. Atau cara berurusan dengan -d
bendera eksplisit .
Atau, saya pikir mungkin ada yang lebih baik LC_COLLATE
untuk digunakan. Namun, sepertinya saya tidak bisa melakukan itu. Saya sedang menggunakan LC_COLLATE="en_AU.UTF-8"
. Saya memeriksa /usr/share/i18n/locales/en_AU
(walaupun saya tidak yakin apakah ini file yang tepat, karena saya tidak dapat melihat referensi apa pun UTF-8
); Saya menemukan yang berikut ini.
LC_COLLATE
copy "iso14651_t1"
END LC_COLLATE
/usr/share/i18n/locales/iso14651_t1
berisi copy "iso14651_t1_common"
. Akhirnya, /usr/share/i18n/locales/iso14651_t1_common
berisi
<U002E> IGNORE;IGNORE;IGNORE;<U002E> # 47 .
Saya menghapus baris ini, berlari sudo locale-gen
, dan me-restart komputer saya. Sayangnya, ini tidak mengubah apa pun.
$@
.Anda dapat menggunakan urutan shell bukan (yang mungkin tidak melibatkan lokal ini pemeriksaan order;
bash
, AT & Tksh
,yash
,tcsh
danzsh
memberikan hasil yang diharapkan,mksh
dandash
. Tidakfish
tampaknya untuk memberikan kasus agar tidak sensitif namun memberikan hasil yang berbeda ketika ada non-ASCII karakter):Ini memberikan
ls
daftar file yang eksplisit (dan direktori) ke daftar, dan menonaktifkanls
penyortiran (-U
, yang merupakan ekstensi GNU).Ada beberapa peringatan, tergantung pada shell yang Anda gunakan.
zsh
,nomatch
opsi default akan menyebabkan perintah gagal jika direktori tidak berisi file tersembunyi dan tidak tersembunyi; Anda dapat menonaktifkannomatch
untuk menghindari itu, tetapi yang lebih baik adalah melakukanset -o cshnullglob
sebaliknya (dan perintah untuk gagal hanya jika tidak ada gumpalan cocok dengan di(t)csh
atau awal kerang Unix).zsh
,pdksh
dan turunannya sertafish
,.*
ekspansi tidak termasuk.
dan..
, jadi ini cocokls -Al
. Dengan kerang lain.
dan..
disertakan sehingga cocokls -al
. Dalam kasus terakhir Anda harus mengubah pola globbing untuk mengecualikan.
dan..
(ls -dUl -- ..?* .[!.]* *
).fish
,(t)csh
atauzsh
, jika ada pola globbing yang tidak cocok dengan apa pun,ls
akan menghasilkan pesan kesalahan; Anda dapat menghindari ini baik dengan menetapkannullglob
pilihan (dalambash
atauzsh
setidaknya), atau dengan mengarahkanstderr
ke/dev/null
(ls -dUl -- ..?* .[!.]* * 2>/dev/null
). Jika Anda menggunakannullglob
, hati-hati terhadap perilaku mengejutkan yang berpotensi menyebabkan (lihat karakter Shell makan `?` ).fish
berperilaku sepertibash
dengannomatch
kecuali bahwa ketika interaktif, pesan peringatan akan dikeluarkan untuk setiap gumpalan yang tidak cocok.(Terima kasih kepada Stéphane Chazelas untuk semua umpan baliknya!)
sumber
mksh
dandash
misalnya tidak akan memilah case-insensitive.-U
(artinya tidak disortir) adalah ekstensi GNU. Beberapals
implementasi lain seperti FreeBSD memiliki-U
tetapi tidak untuk daftar yang tidak disortir.ls
, Anda perlu--
sebelumnya.*
karena implementasi menerima opsi setelah argumen (kecuali POSIXLY_CORRECT ada di lingkungan)ls
sebagai argumen.[!.]
benar. Lihat pubs.opengroup.org/onlinepubs/9699919799/utilities/… . Beberapa shell (paling?) Memungkinkan^
sebagai sinonim untuk!
di gumpalan kelas karakter dinegasikan. Dalam hal apapun, saya lebih suka.[!.] .??* *
yang sedikit lebih dapat dipahami daripada.[!.]* ..?* *
Anda bisa menggunakan dua
ls
perintah terpisah :Berbeda dengan jawaban lain sejauh ini, pendekatan ini menampilkan file titik pertama yang menghindari
.
dan..
entri, kemudian entri yang tersisa dalamls
urutan abjad.Jawaban @StephenKitt mungkin ditingkatkan meskipun untuk mencapai hasil yang sama:
sumber
ls
sebagai argumen. (FWIW saya menggunakan zsh, tapi ini berguna untuk orang-orang bash, saya kira.)Anda dapat bermain dengan opsi perintah ls . Coba ini:
Dimana:
sumber
-X
flag macam oleh ekstensi setelah.
, yang sama sekali berbeda. Juga, file-file tersebut dalam urutan abjad terbalik. Juga, sementara dotfile adalah yang pertama untuk contoh saya, itu tidak akan berfungsi dalam semua kasus (misalnyaa.b
c.d
.a
.c
). Juga, Anda telah menggunakan-a
bukan-A
.