「検索」結果をカウントする最良の方法は何ですか?


95

私の現在の解決策はですがfind <expr> -exec printf '.' \; | wc -c、結果が10000を超える場合、これにはかなり時間がかかります。これを行うより速く/より良い方法はありませんか?


検索結果にwc -lを使用します
Manuel Selva

回答:


81

(必要代わりにこれを試してみてfind-printfサポートを):

find <expr> -type f -printf '.' | wc -c

行を数えるよりも信頼性が高く、高速です。

注私が使用するfindprintfではなく、外部コマンドを。


少しベンチを取りましょう:

$ 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ラインです)


6
同等ではない、より信頼できる=)
Gilles Quenot 2013年

6
検索する-printfフラグがプラットフォームでサポートされていない場合は、信頼性は低下します。;-)
ランディハワード

7
ドットを引用しないことで、さらに数ナノ秒を削ることができることに注意してください-printf '.'
Jens

6
@イェンス-特に、入力にかかる時間を考慮する場合
ブライアンアグニュー

6
このような小さなベンチマークでは、タイミングはおそらく測定したいもの以外の要因によって支配されています。大きな木を使った実験の方が便利でしょう。しかし、これにより、OPが要求したことを実際に行うことに対する私の投票が得られます。
tripleee 2016年

132

何故なの

find <expr> | wc -l

シンプルなポータブルソリューションとして?元のソリューションは printf見つかった個々のファイルごとに新しいプロセス生成するため、非常にコストがかかります(今見つけたように)。

改行が埋め込まれたファイル名がある場合、これは過大評価されますが、それがある場合、問題が少し深く実行されると思います。


9
-1:改行を含むファイルで改行し、バイト数をカウントするよりも遅くなります=)
Gilles Quenot '27年

21
ファイル名/改行の制限が非常にまれであり、上記に述べられていることを考えると、私はそれが反対投票を正当化するとは思わない。もっとゆっくり ?たぶん。ファイルシステムを照会しているので、速度の違いは小さいと思います。10,000ファイル全体で
Brian Agnew

8
'find <expr> | wc -l'と 'find <expr> -printfのパフォーマンスの違い。| wc -c 'は非常に小さいです。キャッシング(つまり、同じツリー上で同じ検索を2回実行する場合)ははるかに重要です。「wc -l」を使用したソリューションの方がはるかに直感的です。
ピットシーカー2013年

4

この解決策は、他のいくつかの解決策よりも確かに遅くなり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バイト)を使用してそこから読み取ることにより、非標準名のファイルを適切に処理します。


3

これは私のcountfiles機能です~/.bashrc(かなり高速で、LinuxとFreeBSD findで機能し、改行文字を含むファイルパスに騙されません。最後の行wcはNULバイトを数えるだけです)。

countfiles () 
{ 
   command find "${1:-.}" -type f -name "${2:-*}" -print0 | 
       command tr -dc '\0' | command wc -c;
return 0
}

countfiles

countfiles ~ '*.txt'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.