Apa pun yang terlibat lskemungkinan akan menghasilkan hasil yang tidak terduga dengan karakter khusus (ruang dan simbol lainnya). Setiap bashism (seperti array) tidak portabel. Apa pun yang melibatkan while readbiasanya lambat.
Di sisi lain, findSANGAT fleksibel (banyak opsi untuk difilter), ia memiliki [setidaknya] dua sintaks yang gagal aman untuk karakter khusus ... dan berskala baik pada direktori besar.
Untuk contoh ini, saya telah digunakan -inameuntuk mencocokkan nama ekstensi huruf besar dan kecil. Saya juga membatasi -maxdepth 1untuk menghormati pertanyaan Anda "di direktori saat ini". Daripada menghitung jumlah baris, di mana nama file dapat menyertakan CR / LF, -print0akan mencetak byte NULL pada akhir setiap nama file ... jadi | tr -d -c "\000" | wc -lmenghitung file dengan akurat (NULL bytes!).
extensions="jpg png gif"
for ext in $extensions; do
c=$(find . -maxdepth 1 -iname "*.$ext" -print0 | tr -d -c "\000" | wc -c)
if [ $c -gt 0 ]; then
echo "Found $c *.$ext files"
find . -maxdepth 1 -iname "*.$ext" -print0 | xargs -0 -r -n1 DOSOMETHINGHERE
# or # find . -maxdepth 1 -iname "*.$ext" -exec "ls" "-l" "{}" ";"
fi
done
PS -print0 | tr -d -c "\000" | wc -cdapat diganti dengan -printf "\000" | wc -catau bahkan -printf '\n' | wc -l.