有什么比 `find 更快的吗?| wc -l` 计算目录中的文件数?

Mat*_*ark 9 linux filesystems ext4 find

我经常需要计算目录中的文件数,有时会达到数百万。

有没有比枚举和计数更好的方法find . | wc -l?是否可以在 ext3/4 上进行某种 I/O 密集程度较低的文件系统调用?

pab*_*ouk 16

不是根本的加速,但至少是一些东西:)

find . -printf \\n | wc -l
Run Code Online (Sandbox Code Playgroud)

您确实不需要传递文件名列表,只需换行即可。当目录缓存在 RAM 中时,这个变体在我的 Ubuntu 12.04.3 上大约快 15%。此外,此变体可以正确处理包含换行符的文件名。

有趣的是,这个变体似乎比上面的变体慢一点:

find . -printf x | wc -c
Run Code Online (Sandbox Code Playgroud)

特殊情况 - 但真的很快

如果目录在它自己的文件系统上,你可以简单地计算 inode:

df -i .
Run Code Online (Sandbox Code Playgroud)

如果其他目录中的目录和文件的数量与计数的相比没有太大变化,您可以简单地从当前df -i结果中减去这个已知数量。通过这种方式,您将能够非常快速地计算文件和目录。

  • @BrianZ:您可以通过在命令前面加上时间来对命令计时。`time find /usr/src/ -printf \\n | wc -l`,您可以使用 `sudo sync && sudo sysctl -w vm.drop_caches=3` 清除运行之间的缓存 (4认同)

the*_*472 5

我正是为了这个目的而编写了ffcnt 。它使用fiemapioctl 检索目录本身的物理偏移量,然后在多个顺序传递中安排目录遍历以减少随机访问。相比之下,您是否真正获得加速取决于find | wc 几个因素:

  • 文件系统类型:支持 ioctl 的文件系统(例如 ext4)fiemap将受益最多
  • 随机访问速度:HDD 的优势远远超过 SSD
  • 目录布局:嵌套目录数量越多,优化潜力越大

当访问否则会导致元数据更新时,(重新)挂载relatime甚至还可以提高速度(对于所有方法)。nodiratime