快速的方法来查找Linux上的一个目录中的文件数量

我正在寻找一种快速的方法来查找Linux上目录中的文件数量。

任何需要线性时间的解决scheme都是不可接受的(比如“ls | wc -l”和类似的东西),因为它需要很长的时间(有数十甚至数亿目录中的文件)。

我确定目录中的文件数量必须作为用于存储目录条目的数据结构的一部分以文件系统结构(inode或许?)的某个简单数字的forms存储 – 我怎样才能达到这个数字?

编辑:文件系统是ext3。 如果没有可移植的方式,我愿意为ext3做一些特定的事情。

Solutions Collecting From Web of "快速的方法来查找Linux上的一个目录中的文件数量"

为什么数据结构中应该包含这个数字? 一棵树不需要知道它在O(1)中的大小,除非它是一个需求(并且提供,可能需要更多的锁定和可能的性能瓶颈)

通过树,我不是说包括subdir的内容,但文件与-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; } 

您可以使用inotify跟踪和记录文件在受监视目录中创建和取消链接事件。 它将分配维护文件数所需的总时间,并允许您立即检索当前文件数。

目录的inode不会存储文件的数量,因为通常不需要单独从目录中的名称列表中单独计算文件数量。 目录st_nlink节点的链接数量间接地给出了子目录的数量( st_nlink是子目录的数目加两)。

我认为你别无选择,只能通读目录中的整个文件列表。 发现可能会或可能不会比ls更快。

这是为什么大型目录是一个问题的例子,即使目录是使用B-tree实现的。

没有可移植的方式来做到这一点。 低级文件原语,即readdir , 就好像它是一个线性列表。 很明显,这是一个抽象,一些文件系统可能会存储一个计数。 但是,访问它本质上是特定于文件系统的。

如果你愿意跳过这个循环,你可以让每个目录在不同的文件系统中,使用配额,并用“repquota”命令获取信息。