penggunaan * dalam pencarian file

9

saat membaca tentang pencarian file linux saya mendapat yang berikut ...

Untuk mencari file menggunakan * wildcard, ganti string yang tidak dikenal dengan *, misalnya jika Anda hanya ingat bahwa ekstensi itu .out, ketik ls * .out

dan ketika saya mencoba perintah berikut pada sistem (ubuntu 14.04 LTS) ..Saya mengerti

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

dalam kasus pertama mengapa ia menunjukkan Tidak ada direktori ( *.bash*) dan dalam kasus berikutnya yang menunjukkan file ( .bash*)

Saya baru dengan rasa ini, dan menurut teori automata saya kelas (*) berarti kombinasi string termasuk epsilon (kosong) ,, Jadi mengapa hasilnya berbeda dalam kedua kasus ....?

lazarus
sumber

Jawaban:

11

Ketika Anda melakukan ls *yang *sedang diperluas sebelum ini dilewatkan ke ls. Maksudnya jika kita memiliki tiga file ( a, bdan c) dalam direktori ls *yang benar-benar berjalan ls a b c.

Ketika Bash tidak bisa mengembang, ia melewati string mentah¹. Itu sebabnya Anda melihat wildcard dalam kesalahan, bersama dengan pesan yang tidak ditemukan. lsmencoba menampilkan daftar untuk file yang dipanggil secara harfiah *.bash*.

Jadi mengapa itu tidak berkembang? Nah dengan globbing default (apa yang disebut ekspansi wildcard ini) tidak akan mengembalikan file yang tersembunyi. Anda dapat mengubah ini dengan shopt -s dotglob(yang tidak akan bertahan kecuali Anda memasukkannya ke dalam .bashrc- itu mungkin dinonaktifkan secara default karena alasan yang baik jadi hati-hati dengan itu), inilah demo cepat:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Pengecualian untuk ini adalah -seperti Anda sudah shown- ketika Anda sudah secara eksplisit dinyatakan file akan tersembunyi dengan pola seperti .bash*. Ini hanya mengesampingkan dotglobpengaturan default :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Lagi pula selain kekhasan itu, saya harap ini membantu Anda memahami apa yang terjadi di bawah permukaan.


Ada yang lain shoptbendera yang mengubah cara globbing karya: extglob, failglob, globstar, nocaseglobdan nullglob. Mereka dan rakit shoptbendera lainnya didokumentasikan sebagai bagian dari manual Bash .

Demikian pula, halaman tentang Pencocokan Pola harus membuat bacaan yang baik.

¹ Kecuali failglobatau nullglobditetapkan.

Oli
sumber
thanx @Oli ,, Saya tidak mendapatkan semua itu karena saya sebutkan saya baru untuk rasa ini ,, tapi saya mendapat 80% dari itu ... Itu membantu saya
lazarus