快速查找Linux上一个目录中的文件数

HC4*_*ica 3 linux filesystems directory file ext3

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

任何在目录中的文件数量中占用线性时间的解决方案都是不可接受的(例如"ls | wc -l"和类似的东西),因为它需要花费相当长的时间(有数十亿甚至数亿目录中的文件).

我确定目录中的文件数必须作为一个简单的数字存储在文件系统结构的某个地方(也许是inode?),作为用于存储目录条目的数据结构的一部分 - 我该如何获得这个数字?

编辑:文件系统是ext3.如果没有可行的方法,我愿意做一些特定于ext3的事情.

Mar*_*ani 6

数据结构为什么要包含数字?树不需要知道它在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上`ls -a`不会从文件系统中读取比程序更多的数据,只要你不传递其他选项,如`--color`或`-F`.请注意,`ls -a`或程序返回的计数包括`.`和`..`条目(因此空目录有两个条目).在Linux上,`ls -A`跳过`.`和`..`. (2认同)
  • @Gilles是对的 - 文件名在目录中,而不是文件inode(毕竟,单个文件inode可以有多个名称).文件名可用于您编写的程序,在`d-> d_name`)中. (2认同)