回答:
(必要代わりにこれを試してみてfind
の-printf
サポートを):
find <expr> -type f -printf '.' | wc -c
行を数えるよりも信頼性が高く、高速です。
注私が使用するfind
のprintf
ではなく、外部コマンドを。
少しベンチを取りましょう:
$ ls -1
a
e
l
ll.sh
r
t
y
z
私のスニペットのベンチマーク:
$ time find -type f -printf '.' | wc -c
8
real 0m0.004s
user 0m0.000s
sys 0m0.007s
フルラインで:
$ time find -type f | wc -l
8
real 0m0.006s
user 0m0.003s
sys 0m0.000s
だから私の解決策はより高速です=)(重要な部分はreal
ラインです)
-printf '.'
何故なの
find <expr> | wc -l
シンプルなポータブルソリューションとして?元のソリューションは、 printf
見つかった個々のファイルごとに新しいプロセスを生成するため、非常にコストがかかります(今見つけたように)。
改行が埋め込まれたファイル名がある場合、これは過大評価されますが、それがある場合、問題が少し深く実行されると思います。
この解決策は、他のいくつかの解決策よりも確かに遅くなりfind -> wc
ますが、ファイル名をカウントするだけでなく、ファイル名を使用して別のことをする傾向がある場合read
は、find
出力から行うことができます。
n=0
while read -r -d ''; do
((n++)) # count
# maybe perform another act on file
done < <(find <expr> -print0)
echo $n
これは、BashGuideで見つかったソリューションの変更であり、find
出力区切り文字をを使用してNULバイトにしprint0
、''
ループ区切り文字として(NULバイト)を使用してそこから読み取ることにより、非標準名のファイルを適切に処理します。