我正在寻找一种快速的方法来查找Linux上目录中文件的数量。任何以目录中的文件数量为线性时间的解决方案都不可接受(例如“ls | wc -l”等),因为它需要极长的时间(目录中有数千万或数亿个文件)。我确信目录中的文件数量必须存储在文件系统结构(例如inode)中作为存储目录条目的数据结构的一部分-如何获取该数字?编辑:文件系统是ext3。如果没有便携式方法可以做到这一点,则愿意执行特定于ext3的操作。
#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;
}
ls -a
不会从文件系统中读取比您的程序更多的数据。请注意,ls -a
或您的程序返回的计数包括“.”和“..”条目(因此空目录有两个条目)。在Linux上,ls -A
跳过“.”和“..”。 - Gilles 'SO- stop being evil'd->d_name
中。 - caf目录的inode不存储其中文件的数量,因为通常文件计数不需要与目录中名称列表分开处理。目录inode的链接计数间接给出子目录的数量(st_nlink
是子目录加二得到的)。
我认为您别无选择,只能浏览整个目录中的文件列表。find命令可能比ls命令快,也可能慢一些。
这是一个例子,说明即使使用B树实现目录,大目录仍然是问题。
没有通用的方法来实现这个。低级文件原语,即readdir,工作方式“好像”它是一个线性列表。显然,这是一种抽象,一些文件系统可能会存储计数。但是,访问它本质上是特定于文件系统的。
如果你愿意费些周折,你可以将每个目录放在不同的文件系统中,使用配额,并使用“repquota”命令获取信息。
/usr/share/terminfo
为每个条目使用的初始字符都有一个子目录,以便可以更像树形结构遍历,以保持文件计数较少。有些文件系统更类似于数据库,其中计数归结为单个快速查询,但这些在Unix世界中并不常见(如果它们存在的话,我不知道)。 - Stephen P