我正在使用以下内容来计算目录及其子目录中的文件数:
find . -type f | wc -l
Run Code Online (Sandbox Code Playgroud)
但是我那里有五十万个文件,计数需要很长时间。
是否有一种更快的方法来计算文件数量,而不涉及将大量文本传输到计算行的内容?这似乎是一种低效的做事方式。
如果您在专用文件系统上有此功能,或者您有稳定数量的文件开销,您可以通过查看文件系统中的 inode 数量来获得足够粗略的文件数量: df -i”:
root@dhcp18:~# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 60489728 75885 60413843 1% /
Run Code Online (Sandbox Code Playgroud)
在我上面的测试框中,我分配了 75,885 个 inode。然而,这些 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% /
Run Code Online (Sandbox Code Playgroud)
注意:并非所有文件系统都以相同的方式维护 inode 计数。ext2/3/4 都可以工作,但是 btrfs 总是报告 0。
如果您必须将文件与目录区分开来,您将不得不遍历文件系统并“统计”每个文件系统以查看它是否是文件、目录、符号链接等……这里最大的问题不是所有文本到“wc”的管道,但在所有 inode 和目录条目中寻找以将这些数据放在一起。
除了“df -i”显示的inode表之外,实际上没有给定目录下有多少文件的数据库。但是,如果此信息对您很重要,您可以通过让程序在此目录中创建文件时增加一个数字并在删除时减少它来创建和维护这样的数据库。如果您不控制创建它们的程序,这不是一个选项。