我使用以下命令来计算目录及其子目录中的文件数量:
find . -type f | wc -l
但是我里面有五十万个文件,计数需要很长时间。
有没有一种更快的方式来计算文件数量,而不需要将大量文本传输到计算行数的程序中?这似乎是一种低效的方法。
答案1
如果你在专用的文件系统上有这个功能,或者你有大量的文件开销,那么你可能能够通过“df -i”查看文件系统中的 inode 数量,从而粗略地计算出文件的数量:
root@dhcp18:~# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 60489728 75885 60413843 1% /
在我上面的测试机上,我分配了 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% /
注意:并非所有文件系统都以相同的方式维护 inode 计数。ext2/3/4 都可以工作,但是 btrfs 总是报告 0。
如果您必须区分文件和目录,那么您将不得不遍历文件系统并“统计”每个文件以查看它是文件、目录、符号链接等......这里最大的问题不是将所有文本传输到“wc”,而是在所有 inode 和目录条目中寻找以将这些数据放在一起。
除了“df -i”显示的 inode 表之外,实际上没有关于给定目录下有多少文件的数据库。但是,如果这些信息对您很重要,您可以创建并维护这样的数据库,方法是让您的程序在此目录中创建文件时增加一个数字,并在删除文件时减少该数字。如果您无法控制创建它们的程序,那么这不是一个选择。
答案2
我针对这个 StackOverflow 问题编写了一个自定义文件计数程序:https://stackoverflow.com/questions/1427032/fast-linux-file-count-for-a-large-number-of-files
如果您想浏览、下载或贡献,可以在这里找到 GitHub 存储库:https://github.com/ChristopherSchultz/fast-file-count
答案3
如果你想递归计算目录中的文件数量定位命令是我所知道的最快的命令,假设您有一个最新的数据库(默认情况下,每天通过 chron 作业执行 sudo update database ..)。但是,如果您避免使用grep管道。
看人定位:
-c, --count
Instead of writing file names on standard output, write the number of
matching entries only.
因此最快的命令是:
locate -c -r '/path/to/dir'
答案4
并行化。find
为每个子目录运行单独的命令并同时运行它们。可以使用自动执行此操作xargs
。