Linux上の1つのディレクトリ内のファイル数を見つけるための高速な方法
-
17-09-2020 - |
質問
Linux上のディレクトリ内のファイルの数を見つけるための高速な方法を探しています。
ディレクトリ内のファイル数で線形時間を取る解決策は受け入れられません(例: "LS | WC -L"や類似のことがあります)。ディレクトリ内の何百万ものファイルの数。
ディレクトリエントリの格納に使用されるデータ構造の一部として、ディレクトリ内のファイルの数(おそらくiノード?)の一部として保存する必要があります。この数?
編集:ファイルシステムはext3です。これを行う携帯方法がない場合は、ext3に固有の何かをしても構わないと思っています。
解決
データ構造に番号を含むのはなぜですか?それが要求されていない限り、ツリーはO(1)でそのサイズを知る必要はありません(そしてそれを提供することができ、より多くのロックおよびパフォーマンスのボトルネックを必要とする可能性がある)
ツリーでは、サブディールの内容を含めているという意味ではありませんが、-maxdepth 1を含むファイル - リストとして実際に保存されていないと想定しています..
編集:ext2それらをリンクリストとして保存してください。
現代のEXT3実装>ハッシュされたBツリー
は、/ BIN / LSをカウント以上のものにし、実際にすべてのiノードをスキャンします。OpenDIR()とReadDir()を使用して独自のCプログラムまたはスクリプトを書きます。
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main()
{
int count;
struct DIR *d;
if( (d = opendir(".")) != NULL)
{
for(count = 0; readdir(d) != NULL; count++);
closedir(d);
}
printf("\n %d", count);
return 0;
}
. 他のヒント
監視対象ディレクトリにイベントの作成とファイルの解像ファイルを追跡して記録することができます。ファイル数を維持するのに必要な合計時間を配布し、現在のファイル数を瞬時に取得することができます。
ディレクトリのiノードは、ファイルの数を保存しません。通常、ファイル数はディレクトリ内の名前のリストとは別に必要ありません。ディレクトリiOodeのリンクカウントは間接的にサブディレクトリの数を与えます(st_nlink
は、サブディールの数と2つの数)です。
ディレクトリ内のファイルのリスト全体を読み取る以外は選択肢がないと思います。見つけられるかもしれないし、LSよりも速くないかもしれません。
Bツリーを使用してディレクトリが実装されている場合でも、大きなディレクトリが問題のある理由の一例です。
これを行うための携帯用方法はありません。低レベルのファイルプリミティブ、つまり readdir 、work のように、それは線形リストです。明らかに、それは抽象化であり、いくつかのファイルシステムはカウントを保存するかもしれません。ただし、それにアクセスすることは本質的にファイルシステム固有です。
フープを飛び越えている場合は、各ディレクトリを別のファイルシステムに入れることができ、クォータを使用して、「repquota」コマンドを使用して情報を取得できます。