Все, що стосується ls, швидше за все, дасть неочікувані результати за допомогою спеціальних символів (пробіл та інші символи). Будь-який башизм (як масиви) не є портативним. Все, що стосуєтьсяwhile readЗазвичай відбувається повільно.
З іншого боку, findДУЖЕ гнучка (багато варіантів для фільтрації), вона має [принаймні] два синтаксиси, які не є безпечними для спеціальних символів ... і він добре масштабується у великих каталогах.
У цьому прикладі я використовував -inameвідповідність як верхнього, так і нижнього регістру. Я також обмежив -maxdepth 1поважати ваше питання "у поточному каталозі". Замість того, щоб рахувати кількість рядків, де імена можуть включати CR / LF, -print0буде надруковано байт NULL в кінці кожного імені файлу ... так | tr -d -c "\000" | wc -lце точно підрахунок файлів (NULL байт!).
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можна замінити -printf "\000" | wc -cабо навіть -printf '\n' | wc -l.