GNU/Linux >> Linux の 問題 >  >> Linux

`find よりも速いものはありますか? | | wc -l`ディレクトリ内のファイルをカウントするには?

根本的なスピードアップではありませんが、少なくとも何か:)

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

Linux
  1. 新しいディレクトリに何かが追加される前に、ハードリンクカウントが2になるのはなぜですか?

  2. ディレクトリ付きの猫ファイル?

  3. ディレクトリ内のファイルの名前を変更しますか?

  1. ディレクトリ内のすべてのファイルを解凍します

  2. 各ディレクトリ内のファイル数を数える方法は?

  3. rsync ディレクトリ内の N 個の最新ファイル

  1. 特定のディレクトリ内のファイルとサブディレクトリの数をカウントする方法

  2. コマンドラインを使用してディレクトリ内のファイルの数を取得するにはどうすればよいですか?

  3. 年齢別にファイルを削除しますか?