代码之家  ›  专栏  ›  技术社区  ›  HighCommander4

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

  •  3
  • HighCommander4  · 技术社区  · 16 年前

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

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

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

    5 回复  |  直到 16 年前
        1
  •  6
  •   Marco Mariani    16 年前

    我所说的树并不是指包含subdir内容,而是-maxdepth为1的文件——假设它们不是以列表的形式存储的。。

    现代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;
    }
    
        2
  •  2
  •   Amardeep AC9MF    16 年前

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

        3
  •  1
  •   user25148 user25148    16 年前

    目录的inode不存储其中的文件数,因为通常不需要将文件计数与目录中的名称列表分开。目录inode的链接计数确实间接给出了子目录的数量( st_nlink 是子目录数加上2)。

    我想你别无选择,只能通读目录中的所有文件。查找可能比ls快,也可能不快。

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

        4
  •  0
  •   Matthew Flaschen    16 年前

    没有便携的方法可以做到这一点。底层文件原语,即。 readdir ,工作 犹如 这是一个线性列表。显然,这是一种抽象,有些文件系统可能会存储一个计数。但是,访问它本质上是特定于文件系统的。

        5
  •  0
  •   Mark Wagner    16 年前

    推荐文章