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

任何在目录中的文件数量上花费线性时间的解决方案都是不可接受的(例如“ls | wc -l”和类似的东西),因为这会花费非常长的时间(目录中有数千万甚至数亿个文件)。

我确信目录中的文件数量必须作为一个简单的数字存储在文件系统结构中的某个位置(也许是索引节点?),作为用于存储目录条目的数据结构的一部分 - 我怎样才能得到这个数字?

编辑:文件系统是ext3。如果没有可移植的方法来做到这一点,我愿意做一些特定于 ext3 的事情。

有帮助吗?

解决方案

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

通过树,我不是指包括子模型内容,但是带有-maxdepth 1的文件 - 假设它们并不真正存储为列表..

编辑:ext2存储为链接列表。

现代ext3实现散列b树

已经说过,/ bin / ls比计数多得多,实际上扫描了所有inodes。使用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 是子目录的数量加二)。

我认为除了阅读目录中的整个文件列表之外,您别无选择。find 可能比 ls 快,也可能不快。

这是为什么大目录是一个问题的示例,即使该目录是使用 B 树实现的。

没有便携方式来做这件事。低级文件原语,即 readdir ,工作好像这是一个线性列表。显然,这是一个抽象,有些文件系统可能会存储计数。但是,访问它是固有的文件系统特定的。

如果您愿意跳过箍,您可能会在不同的文件系统中使用每个目录,使用配额,并使用“repquota”命令获取信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top