我正在使用以下来计算目录中的文件数及其子目录:
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