根本的なスピードアップではありませんが、少なくとも何か:)
find . -printf \\n | wc -l
ファイル名のリストを渡す必要はありません。改行だけで十分です。このバリアントは、ディレクトリが RAM にキャッシュされている場合、私の Ubuntu 12.04.3 で約 15% 高速です。さらに、このバリアントは、改行を含むファイル名でも正しく機能します。
興味深いことに、この亜種は上記のものよりも少し遅いようです:
find . -printf x | wc -c
特殊なケース - しかし非常に高速
ディレクトリが独自のファイル システム上にある場合は、単純に inode を数えることができます:
df -i .
カウントされたディレクトリ以外のディレクトリとファイルの数があまり変わらない場合は、現在の df -i
からこの既知の数を単純に差し引くことができます。 結果。このようにして、ファイルとディレクトリを非常に迅速に数えることができます。
私はまさにその目的のためにffcntを書きました。 fiemap
でディレクトリ自体の物理オフセットを取得します ioctl を実行し、複数の順次パスでディレクトリ トラバーサルをスケジュールして、ランダム アクセスを減らします。 find | wc
と比較して実際にスピードアップするかどうか いくつかの要因によって異なります:
- ファイルシステムの種類:
fiemap
をサポートする ext4 などのファイルシステム ioctl が最もメリットがあります - ランダム アクセス速度:HDD は SSD よりもはるかにメリットがあります
- ディレクトリ レイアウト:ネストされたディレクトリの数が多いほど、最適化の可能性が高くなります
relatime
で (再) マウント または nodiratime
また、アクセスによってメタデータの更新が発生する場合に、(すべてのメソッドで) 速度が向上する可能性があります。
実際、私のシステム (Arch Linux) では、このコマンド
ls -A | wc -l
上記のすべてよりも高速です:
$ time find . | wc -l
1893
real 0m0.027s
user 0m0.004s
sys 0m0.004s
$ time find . -printf \\n | wc -l
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time find . -printf x | wc -c
1893
real 0m0.009s
user 0m0.000s
sys 0m0.008s
$ time ls -A | wc -l
1892
real 0m0.007s
user 0m0.000s
sys 0m0.004s