我正在寻找一种快速查找Linux目录中文件数量的方法。
任何在目录中的文件数量都需要线性时间的解决方案是不可接受的(例如“ls | wc -l”和类似的东西)因为它需要花费相当长的时间(有几十个或几百个)目录中的数百万个文件。)
我确定目录中的文件数必须作为一个简单的数字存储在文件系统结构的某个地方(也许是inode?),作为用于存储目录条目的数据结构的一部分 - 我怎样才能到达这个号码?
编辑:文件系统是ext3。如果没有可行的方法,我愿意做一些特定于ext3的事情。
答案 0 :(得分:6)
为什么数据结构应包含数字?树不需要知道它在O(1)中的大小,除非它是一个要求(并提供,可能需要更多的锁定和可能的性能瓶颈)
通过树我不是指包含subdir内容,而是包含-maxdepth 1的文件 - 假设它们并未真正存储为列表..
编辑:ext2将它们存储为链表。
现代ext3实现了hashed B-Trees
话虽如此,/ bin / ls做的不仅仅是计数,而且实际上扫描了所有的inode。使用opendir()和readdir()编写自己的C程序或脚本。
来自here:
#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;
}
答案 1 :(得分:2)
您可以使用inotify来跟踪和记录受监视目录中的文件创建和取消链接事件。它将分配维护文件计数所需的总时间,并允许您即时检索当前文件计数。
答案 2 :(得分:1)
目录的inode不存储其中的文件数,因为通常不需要文件计数与目录中的名称列表分开。目录inode的链接计数间接给出了子目录的数量(st_nlink
是子目录的数量加上两个)。
我认为除了阅读目录中的整个文件列表外别无选择。发现可能会或可能不会比ls快。
这是大型目录出现问题的一个例子,即使目录是使用B树实现的。
答案 3 :(得分:0)
没有可移植的方法来做到这一点。低级文件基元,即readdir,工作,好像它是一个线性列表。显然,这是一个抽象,一些文件系统可能存储计数。但是,访问它本质上是特定于文件系统的。
答案 4 :(得分:0)
如果您愿意跳过箍,可以将每个目录放在不同的文件系统中,使用配额,并使用“repquota”命令获取信息。