untuk loop glob mishaps

10

Saya mencoba membuat skrip yang akan mengulangi serangkaian direktori, dan melakukan satu hal ketika menemukan file .jpg, dan lainnya ketika menemukan file .nef. Masalahnya adalah, jika sebuah direktori tidak memiliki file .jpg misalnya (atau .nef) maka entri glob tidak lagi berupa glob yang diperluas, tetapi hanya sebuah string. Sebagai contoh:

my_dir="pictures/"
ext="JPG"
for f in "$my_dir"*."$ext"; do
    echo $f
done

jika folder my_dir memiliki file .JPG di dalamnya, maka mereka akan digaungkan dengan benar pada baris perintah.

pictures/one.JPG
pictures/two.JPG

Namun, jika my_dir tidak memiliki file .JPG, maka loop akan masuk untuk satu iterasi dan gema:

pictures/*.JPG

bagaimana cara membuat ini sehingga jika gumpalan tidak cocok, itu tidak masuk ke loop for?

Vince W.
sumber

Jawaban:

17

Ini adalah perilaku normal dan standar: Jika globbing gagal mencocokkan file / direktori, karakter globbing asli akan dipertahankan.

Jika Anda ingin mendapatkan kembali hasil yang kosong, Anda dapat mengatur nullglobopsi di skrip Anda sebagai berikut:

$ shopt -s nullglob
$ for f in "$my_dir"*."$ext"; do echo $f; done
$

Anda dapat menonaktifkannya dengan:

$ shopt -u nullglob
joepd
sumber
6

Melangkah sedikit ke samping, menggunakan findmungkin juga berguna di sini jika perintah yang Anda jalankan untuk file cukup sederhana untuk dijatuhkan pada satu baris. Find dapat mengambil beberapa jalur untuk mencari, dan dengan senang hati akan menemukan file apa pun di subdirektori juga.

$ find foo/ bar/ -name "*.jpg" -exec echo {} \;
foo/ccc.jpg
foo/bbb.jpg
bar/aaa.jpg

(Perintah yang dieksekusi diberikan setelah -execflag, diakhiri dengan ;. {}Akan diganti dengan nama file saat ini.)

ilkkachu
sumber
3

tambahkan baris ini ke awal skrip Anda

shopt -s nullglob
steve
sumber