珍しいことではありませんが、ディレクトリ内のファイル数を数える必要があります。数百万に達する場合もあります。
単にそれらを列挙して数えるよりも良い方法はありfind . | wc -l
ますか?I / Oの負荷が少ないext3 / 4で実行できるファイルシステム呼び出しの種類はありますか?
find -maxdepth 1
です。現在のアプローチでは、改行文字を含む名前はすべて二重にカウントされることに注意してください。
珍しいことではありませんが、ディレクトリ内のファイル数を数える必要があります。数百万に達する場合もあります。
単にそれらを列挙して数えるよりも良い方法はありfind . | wc -l
ますか?I / Oの負荷が少ないext3 / 4で実行できるファイルシステム呼び出しの種類はありますか?
find -maxdepth 1
です。現在のアプローチでは、改行文字を含む名前はすべて二重にカウントされることに注意してください。
回答:
基本的なスピードアップではなく、少なくとも何か:)
find . -printf \\n | wc -l
ファイル名のリストを渡す必要はなく、改行で十分です。このバリアントは、ディレクトリがRAMにキャッシュされている場合、Ubuntu 12.04.3で約15%高速です。さらに、このバリアントは改行を含むファイル名で正しく動作します。
興味深いことに、この亜種は上記のものより少し遅いようです:
find . -printf x | wc -c
ディレクトリが独自のファイルシステム上にある場合は、単にiノードを数えることができます。
df -i .
カウントされたディレクトリ以外のディレクトリおよびファイルの数がほとんど変わらない場合は、現在のdf -i
結果からこの既知の数を単に差し引くことができます。このようにして、ファイルとディレクトリを非常に迅速に数えることができます。
time find /usr/src/ -printf \\n | wc -l
、実行の合間にキャッシュをクリアできますsudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
と同じであることを意図-printf '\0'
?ドキュメントに記載されていません。
-printf
のprintf()
関数と同様に機能しますが、主な違いは、%
ディレクティブの意味が異なることです。アクションは、見つかったすべてのファイルに対して呼び出されます。つまり、これは、見つかったすべてのファイル-printf x
の文字x
を印刷し(試してみてください!)、見つかったすべてのファイル-printf '\0'
の文字NULL(ASCIIコード0)を印刷します。-printf '\0'
特別な意味はありません。wc -c
この回答の例では、どちらも同じように機能します。
私はまさにその目的のためにffcntを書きました。fiemap
ioctlを使用してディレクトリ自体の物理オフセットを取得し、ランダムアクセスを減らすために、複数の順次パスでディレクトリトラバーサルをスケジュールします。と比較して実際に速度が向上するかどうかfind | wc
は、いくつかの要因に依存します。
fiemap
ioctl をサポートするext4などのファイルシステムが最もメリットがあります(すべての方法で)を使用して(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
/bin/ls: Argument list too long
グロビングを使用する場合と同様に返されることが多いことですが、findのように再帰的に動作できるため、検討する必要がある場合があるため、必要ない場合はfindを使用しないでください。
ls -A
ですが、現在のディレクトリにあるファイルのみをリストし、引数find
なしで-maxdepth 1
はすべてのサブディレクトリを再帰的に検索します。