Apa pun yang terlibat ls
kemungkinan akan menghasilkan hasil yang tidak terduga dengan karakter khusus (ruang dan simbol lainnya). Setiap bashism (seperti array) tidak portabel. Apa pun yang melibatkan while read
biasanya lambat.
Di sisi lain, find
SANGAT 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 -iname
untuk mencocokkan nama ekstensi huruf besar dan kecil. Saya juga membatasi -maxdepth 1
untuk menghormati pertanyaan Anda "di direktori saat ini". Daripada menghitung jumlah baris, di mana nama file dapat menyertakan CR / LF, -print0
akan mencetak byte NULL pada akhir setiap nama file ... jadi | tr -d -c "\000" | wc -l
menghitung 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 -c
dapat diganti dengan -printf "\000" | wc -c
atau bahkan -printf '\n' | wc -l
.