任何涉及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
。