Saya memiliki struktur direktori ini:
~/tmp/globstar ɀ find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
dan, dengan globstar
opsi yang diaktifkan di Bash, saya dapat mengatakan:
~/tmp/globstar ɀ ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext
Pertanyaan saya adalah: mengapa dir/file.ext
dikecualikan dari daftar ini?
Bash manual mengatakan ini tentang globstar
:
Jika diatur, pola '**' yang digunakan dalam konteks ekspansi nama file akan cocok dengan semua file dan nol atau lebih direktori dan subdirektori. Jika polanya diikuti oleh '/', hanya direktori dan subdirektori yang cocok.
" Nol " dalam paragraf ini izinkan saya dengan kesan yang dir/file.ext
seharusnya dimasukkan; kecuali saya mudah-mudahan kehilangan sesuatu.
ɀ
?unicode ɀ
atau Wikipediaɀ
hanyalah karakter yang digunakan di sini untuk membedakan prompt. Beberapa pengguna lebih suka karakter£
atau€
bukannya$
:). Awalnya,ɀ
karakter 'z' dibuat untuk notasi bahasa khusus Afrika :-)Jawaban:
Saya kira itu merujuk pada level subdirektori saja.
**
tanpa/
korek apisemua file dan direktori
nol atau lebih subdirektori
Tapi itu tidak sepenuhnya hilang.
**/
berarti tidak ada file dalam direktori level tertinggi yang**
berlaku untuk dicocokkan.Kamu butuh
dir/*.ext dir/**/*.ext
.sumber
Ini berfungsi seperti yang Anda harapkan dalam versi Bash ini sebagaimana disertakan dengan distribusi yang terdaftar:
Sebenarnya versi yang tercantum di atas adalah semua yang saya uji. Dengan kata lain saya tidak menemukan versi 4 dari Bash yang tidak berfungsi. Opsi
globstar
ditambahkan di Bash 4.0 lihat PERUBAHAN . Dalam versi yang lebih lama perintahnyashopt -s globstar
harus mengembalikan kesalahan.Tes
1.
dir/**/*.ext
cocokdir/file.ext
:2.
**/*.ext
cocokfile.ext
:Mempersiapkan lingkungan untuk mereproduksi tes di atas:
sumber
shopt -s globstar
.Saya melihat Anda seperti Anda telah / telah mematikan globstar. Ini bisa dihidupkan seperti ini:
Tidak hanya itu tidak cocok dengan nol subdirektori, tetapi juga tidak akan cocok dengan dua subdirektori:
Dengan globstar off, ** akhirnya berperilaku seperti *, jadi
dir/**/*.ext
dapatkan hasil yang sama dengandir/*/*.ext
yang terkadang menipu saya untuk berpikir bahwa globstar aktif
periksa pengaturan globstar Anda saat ini seperti ini:
sumber
shopt globstar
.