3

Linux のディレクトリ内のファイル数をすばやく見つける方法を探しています。

ディレクトリ内のファイルの数に比例して時間がかかるソリューションは受け入れられません (たとえば、「ls | wc -l」など)。ディレクトリ内のファイル)。

ディレクトリ内のファイルの数は、ディレクトリエントリを格納するために使用されるデータ構造の一部として、ファイルシステム構造 (おそらく i ノード?) のどこかに単純な数値として格納する必要があると確信しています-どうすればこの数値に到達できますか?

編集:ファイルシステムはext3です。これを行う移植可能な方法がない場合は、ext3 に固有の方法を実行したいと考えています。

4

5 に答える 5

6

データ構造に数値を含める必要があるのはなぜですか? ツリーは、それが要件でない限り、O(1) でそのサイズを知る必要はありません (それを提供すると、より多くのロックが必要になり、パフォーマンスのボトルネックになる可能性があります)。

ツリーとは、サブディレクトリの内容を含めることを意味するのではなく、 -maxdepth 1 のファイルを含めることを意味します-実際にはリストとして保存されていないと仮定します..

編集:ext2はそれらをリンクリストとして保存しました。

最新の ext3 は、ハッシュされた B ツリーを実装します

そうは言っても、/bin/ls はカウント以上のことを行い、実際にすべての inode をスキャンします。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;
}
于 2010-07-19T17:52:52.130 に答える
2

inotify を使用して、監視対象ディレクトリ内のファイルの作成およびリンク解除イベントを追跡および記録できます。ファイル数を維持するために必要な合計時間を分散し、現在のファイル数を即座に取得できるようにします。

于 2010-07-20T01:01:55.147 に答える
1

通常、ディレクトリ内の名前のリストとは別にファイル数は必要ないため、ディレクトリの inode にはファイル数は格納されません。ディレクトリ i ノードのリンク カウントは、間接的にサブディレクトリの数を示します (サブディレクトリのst_nlink数に 2 を加えた数です)。

ディレクトリ内のファイルのリスト全体を読む以外に選択肢はないと思います。find は ls よりも速い場合とそうでない場合があります。

これは、ディレクトリが B ツリーを使用して実装されている場合でも、大きなディレクトリが問題になる理由の例です。

于 2010-07-19T18:03:31.813 に答える
0

フープをジャンプしたい場合は、各ディレクトリを異なるファイルシステムに配置し、クォータを使用して、「repquota」コマンドで情報を取得できます。

于 2010-07-19T23:53:17.370 に答える
0

これを行う移植可能な方法はありません。低レベルのファイル プリミティブ、つまりreaddirは線形リストのように機能します。明らかに、これは抽象化であり、ファイルシステムによってはカウントが格納される場合があります。ただし、アクセスは本質的にファイルシステム固有です。

于 2010-07-19T17:52:01.203 に答える