Все, что связано ls
, может привести к неожиданным результатам со специальными символами (пробел и другие символы). Любой bashism (как массивы) не переносим. Все, что связано 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
.