関係するものls
はすべて、特殊文字(スペースおよびその他の記号)で予期しない結果を生成する可能性があります。bashism(配列など)は移植性がありません。while read
通常、関与するものはすべて低速です。
一方、find
非常に柔軟性があり(フィルタリングするオプションがたくさんあります)、特殊な文字に対してはフェールセーフな[少なくとも] 2つの構文があります...そして、大きなディレクトリでうまく拡張できます。
この例では、-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
。