İlgili her lsşeyin özel karakterlerle (boşluk ve diğer semboller) beklenmedik sonuçlar üretmesi muhtemeldir. Herhangi bir bashizm (diziler gibi) taşınabilir değildir. İçeren her şey while readgenellikle yavaştır.
Öte yandan, findÇOK esnek (filtreleme seçenekleri bir sürü), özel karakterleri için güvenli başarısız en az iki sözdizimi vardır ... ve büyük dizinde iyi ölçeklendirir.
Bu örnekte, -inamehem büyük hem de küçük harfli uzantı adıyla eşleştim. Ayrıca -maxdepth 1sorunuzun "geçerli dizinde" saygı gösterilmesini de kısıtladım . Dosya adlarının CR / LF içerebileceği satır sayısını saymak yerine -print0, her dosya adının sonuna bir NULL bayt yazdıracaktır ... bu yüzden | tr -d -c "\000" | wc -ldosyaları doğru şekilde sayar (NULL bayt!).
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 veya hatta -print0 | tr -d -c "\000" | wc -cdeğiştirilebilir .-printf "\000" | wc -c-printf '\n' | wc -l