在 Linux 中快速递归统计文件数量的方法

在 Linux 中快速递归统计文件数量的方法

我使用以下命令来计算目录及其子目录中的文件数量:

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

相关内容