連番の空ファイルを生成するワンライナーでファイルを作成したものの、
ウン十万・ウン百万個以上のファイルを作成するとlsするだけでも時間がかかる。
1. lsを使ってカウント
$ ls -1 | wc -l
-1オプションで1行に1ファイル表示させ、wc -l
で行数をカウントする
行数でなく単語数(ファイル数)でカウントしてもよい
$ ls | wc -w
2. findを使ってカウント
$ find . -type f | wc -l
カウント速度を比較してみる
10万ファイルを作成し比較
$ seq -f "file_%06g" 100000 | xargs touch
$ time ls -1 | wc -l
100000
real 0m0.357s
user 0m0.320s
sys 0m0.044s
$ time find . -type f |wc -l
100000
real 0m0.162s
user 0m0.020s
sys 0m0.152s
lsの方が遅いのか?
lsはデフォルトでソートを実施するので時間がかかる。
そこで、-U
オプションを用いるとソートを実施しないようにする
$ ls -U1 | wc -l
カウント速度を計測
$ time ls -U1 | wc -l
100000
real 0m0.068s
user 0m0.020s
sys 0m0.052s
findよりも早くなりました。
(※13/10/02 追記)
lsでサブディレクトリを考慮して厳密にカウントするなら、下記のようにしたほうがよいとコメントを頂きました。
ls -F | grep -v / | wc -l