İ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 read
genellikle 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, -iname
hem büyük hem de küçük harfli uzantı adıyla eşleştim. Ayrıca -maxdepth 1
sorunuzun "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 -l
dosyaları 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 -c
değiştirilebilir .-printf "\000" | wc -c
-printf '\n' | wc -l