是`ls -f | 当使用POSIX / Unix系统(大数据)时,grep -c。是目录中最快的方法吗?

我曾经做过ls path-to-whatever| wc -l ls path-to-whatever| wc -l ,直到我发现,它实际上消耗了大量的内存。 然后我移动到find path-to-whatever -name "*" | wc -l find path-to-whatever -name "*" | wc -l ,这似乎消耗了大量的内存,无论有多less文件。

然后我了解到,由于对结果进行sorting,ls通常很慢并且内存效率较低。 通过使用ls -f | grep -c . ls -f | grep -c . ,一个会得到非常快的结果; 唯一的问题是文件名可能有“换行符”。 但是,对于大多数用例来说这是一个很小的问题。

这是计数文件的最快方法吗?

编辑/可能的答案:看来,当涉及到大数据,一些版本的LS,发现等已被报告与>八百万文件(需要确认虽然)挂起。 为了获得非常大的文件数量(我的猜测是> 22亿),应该使用getdents64系统调用而不是getdent,这可以用大多数支持POSIX标准的编程语言来完成。 有些文件系统可能提供更快的非POSIX方法来计算文件。

一种方法是使用readdir并计算条目(在一个目录中)。 下面我计算常规文件,并使用d_type==DT_REG这是有限的操作系统和FS( man readdir和看NOTES)可用,但你可以注释掉这一行,并计算所有目录条目:

 #include <stdio.h> #include <dirent.h> int main (int argc, char *argv[]) { struct dirent *entry; DIR *dirp; long long c; // 64 bit if(argc<=1) // require dir return 1; dirp = opendir (argv[1]); if (dirp == NULL) { // dir not found return 2; } while ((entry = readdir(dirp)) != NULL) { if(entry->d_type==DT_REG) c++; // printf ("%s\n", entry->d_name); // for outputing filenames } printf ("%lli\n", c); closedir (dirp); return 0; } 

编译并运行:

 $ gcc code.c $ ./a.out ~ 254 

(我需要清理我的家庭目录:)

编辑:

我触摸了一个1000000个文件到一个目录并运行一个快速的比较(最好的用户+系统5提出):

 $ time ls -f | grep -c . 1000005 real 0m1.771s user 0m0.656s sys 0m1.244s $ time ls -f | wc -l 1000005 real 0m1.733s user 0m0.520s sys 0m1.248s $ time ../a.out . 1000003 real 0m0.474s user 0m0.048s sys 0m0.424s 

编辑2

根据评论的要求:

 $ time ./a.out testdir | wc -l 1000004 real 0m0.567s user 0m0.124s sys 0m0.468s