Subscribed unsubscribe Subscribe Subscribe

Bashでファイル数を数えるには

カレントディレクトリ(というか任意のディレクトリ)以下すべてのファイル数を数えるなら大体の人が

find ./ -type f| wc -l

とするでしょう、おそらく。
しかし待ってほしい。パイプの細かいことは知らんけど、単純に考えるとこれだとfindから出力されたフルパスなり相対パスなりの文字列がバッファされてパイプ経由でwcが食ってる状態と考えられないだろうか。というかそうだよね?ためしに家のサーバの / で実行したらfindが出力した文字列は約16MBになった。これはでかすぎやしないだろうか。そこでいろいろ考えて

find ./ -type f -printf 0| wc -c

としてみた。これならパイプ経由で渡される文字列は259KBくらい。で、一番重要な速度はというと

[root@myserver /]# time (find / -type f| wc -l)
264656

real    0m3.252s
user    0m1.072s
sys     0m2.048s
[root@myserver /]# time (find / -type f -printf 0| wc -c)
264656

real    0m2.427s
user    0m0.723s
sys     0m1.701s

約26万ファイルで0.8秒差ってとこ。数千万ファイルあるサーバとかならもっと差が出るかも。しかし結局のところパイプで一度バッファしてる感じなので、これどうにかfindだけで完結できないかなーと思って調べてたけど、結局わからなかった。

お過ぎさん、あとは任せた。