在linux中快速recursion计数文件的方法

我正在使用以下来计算目录中的文件数及其子目录:

find . -type f | wc -l 

但是我有50万个文件,而且这个计数需要很长时间。

有没有更快的方法来计算文件的数量,这不涉及大量的文字到重要的行数? 这似乎是一种无效的方式来做事情。

如果你在一个专用的文件系统上有这个function,或者你有一个稳定的文件数量,你可以通过查看文件系统中的inode数量来得到一个足够粗略的文件数量, df -i“:

 root@dhcp18:~# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 60489728 75885 60413843 1% / 

在上面的testing框中,我分配了75,885个节点。 但是,这些inode不仅仅是文件,它们也是目录。 例如:

 root@dhcp18:~# mkdir /tmp/foo root@dhcp18:~# df -i /tmp Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 60489728 75886 60413842 1% / root@dhcp18:~# touch /tmp/bar root@dhcp18:~# df -i /tmp Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 60489728 75887 60413841 1% / 

注意:并非所有文件系统都以同样的方式维护inode。 ext2 / 3/4将全部工作,但是btrfs总是报告0。

如果你不得不区分文件和目录,你将不得不遍历文件系统和“统计”每一个,看看它是一个文件,目录,sym-link等…这里最大的问题不是所有文本的pipe道都是“wc”,而是在所有的inode和目录条目中寻找数据,把这些数据放在一起。

除了“df -i”所示的inode表之外,实际上没有关于给定目录下有多less文件的数据库。 但是,如果这些信息对您很重要,您可以创build和维护这样一个数据库,方法是让程序在此目录中创build文件时增加一个数字,并在删除时将其减less。 如果你不控制创build它们的程序,这不是一个选项。

我也会尝试:

find topDir -maxdepth 3 -printf'%h%f \ n'

然后处理输出,减less到目录的计数。

如果您预计目录结构,这是特别有用的。

如果你已经find安装你可以使用

 locate -r '.' | grep -c "^$PWD" 

或者获得文件系统的结果

 locate -S 

如果你有很多文件,它会比find更快。

唯一的缺点是, 它也计数目录

试试这个方便的小Python脚本,看看它是否更快。

 from os import walk print sum([len(files) for (root, dirs, files) in walk('/some/path')]) 

安德鲁

我写这个StackOverflow问题的自定义文件计数程序: https ://stackoverflow.com/questions/1427032/fast-linux-file-count-for-a-large-number-of-files

你可以在这里findGitHub repo,如果你想浏览,下载或贡献: https : //github.com/ChristopherSchultz/fast-file-count