Все, що стосується 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
.