"Ls" atau regex tidak sensitif huruf besar-kecil?

5

Dalam bash, saya mencoba

ls [a-z]*

dan diharapkan untuk membuat daftar semua file dengan nama file dimulai dengan huruf kecil. Tetapi mengapa file dengan nama dimulai dengan huruf besar juga ditampilkan?

>ls [a-z]*
D  e
>

Jika perlu, versi bash:

bash --versi GNU bash, versi 4.1.5 (1) -release (i486-pc-linux-gnu) Hak Cipta (C) 2009 Free Software Foundation, Inc. Lisensi GPLv3 +: GNU GPL versi 3 atau lebih baru http: // gnu .org / lisensi / gpl.html

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
zhanwu
sumber
* di bash bukan regex *. [az] terlihat seperti regex dan bash sepertinya menerimanya. Misalnya a + tidak akan cocok dengan aaa, jadi jika itu mendukung regex, ia tidak bisa. Saya tidak yakin sampai sejauh mana jika sama sekali. gema a {3}, gema a \ {3 \} hanya gema a {3} dan tidak menafsirkannya seperti sebuah regex.
barlop
berikut adalah artikel tentang pencocokan pola bash faqs.org/docs/bashman/bashref_35.html itu menyebutkan "Jika opsi shell extglob diaktifkan menggunakan shopt builtin, beberapa operator pencocokan pola diperluas diakui. Dalam deskripsi berikut, sebuah pola- daftar adalah daftar satu atau lebih pola yang dipisahkan oleh `| '. Pola komposit dapat dibentuk menggunakan satu atau lebih dari sub-pola berikut:" Tapi saya tidak yakin bagaimana Anda akan mengaktifkan opsi itu
barlop
Di cygwin, [az] * sepertinya tidak persis sama dengan [[: lebih rendah:]] * mereka tidak menampilkan huruf besar. GNU bash, versi 3.2.51 (24) -release (i686-pc-cygwin)
barlop
1
@barlop: Perilaku rentang karakter tergantung pada lokal, khususnya LC_COLLATEpengaturan Di beberapa (banyak?) lokal, [a-z]termasuk "aAbB ... yYz" tetapi tidak "Z". Anda dapat mengaktifkan globbing diperpanjang menggunakan shopt -s extglob. Saya mendapatkan hasil berbeda untuk [a-z]dan [[:lower:]]di Cygwin.
Dennis Williamson

Jawaban:

3

Ini bukan regexp, yang merupakan penyebab kebingungan. Sebaliknya, ia menggunakan sistem yang disebut "globbing" - lihat:

$ man 7 glob

Alih-alih [az] Anda harus menggunakan [[: lebih rendah:]] seperti:

$ ls -d [[:lower:]]*
Majenko
sumber
itu "globbing" yang disebut "ekspansi pathname"?
zhanwu
Tidak - perluasan pathname adalah hal-hal seperti ~ fred / foo.bar yang diterjemahkan ke /home/fred/foo.bar
Majenko
1

1) Ini mungkin tergantung pada sistem operasi Anda, lebih khusus sistem file Anda. Apakah case sistem file Anda sensitif? Anda tidak menyebutkan OS, atau tipe sistem file.

2) bash juga dapat melakukan globbing case sensitif. Anda dapat memeriksa untuk melihat apakah ini kasus Anda saat ini denganshopt | grep nocaseglob

Juga, sebagai tambahan, ingat bahwa lstidak melakukan apa pun dengan file. Shell Anda, lalu meneruskan nama file ke ls.

Homolka yang kaya
sumber