【问题标题】:The fastest way to count the number of files in a directory (including subdirectories)统计目录(包括子目录)中文件数的最快方法
【发布时间】:2015-08-19 13:49:23
【问题描述】:

我正在运行一个脚本来查看目录及其子目录中的所有文件。

脚本已经运行了一天,我想估计它会运行多长时间。我知道到目前为止它处理了多少文件(73,000,000),但我不知道文件总数。

统计文件的最快方法是什么?

我尝试右键单击目录并选择“属性”,它正在慢慢计数。 我尝试将 ls 重定向到一个文件中,它只是在搅动和搅动......

我应该用c写程序吗?

【问题讨论】:

标签: linux performance


【解决方案1】:

最简单的方法:

find <dir> -type f | wc -l

可能稍微快一点:

find <dir> -type f -printf '\n' | wc -l

【讨论】:

  • 你觉得 find 会比 ls 快吗?
  • 这比将ls 的输出保存到文件要快。它将与ls -R | wc -l 相当。
【解决方案2】:

我做了一个快速的研究。使用包含 100,000 个文件的目录,我比较了以下命令:

ls -R <dir>
ls -lR <dir>
find <dir> -type f

我运行了两次,一次重定向到文件 (&gt;file),一次通过管道传输到 wc (|wc -l)。以下是以秒为单位的运行时间:

        >file   |wc
ls -R     14     14
find      89     56
ls -lR    91     82

&gt;file|wc -l 之间的差异小于 lsfind 之间的差异。

看来ls -R 至少比find4x

【讨论】:

  • 我无法撤消我的赞成票,但这是错误的。 ls -R 可能更快,但它也会给出不正确的结果。首先,这包括目录和文件。更糟糕的是,输出被格式化,并且那些格式化行也被计算在内。
【解决方案3】:

我知道的最快的:

ls | wc -l

注意:请记住,尽管它列出了目录中的所有节点,包括子目录以及对当前目录和父目录的两个引用(...)。

如果您需要所有子目录中的文件递归计数(而不是包括当前目录中的子目录在内的所有内容),那么您可以将“递归”标志添加到ls 命令:

ls -R | wc -l

如果您将此速度与使用 find 的建议进行比较,您会发现它要快得多(因子 2 到 10),但请记住上面的注释。

【讨论】:

  • 这会丢失子目录中的文件。
  • @RSamuelKlatchko 是的,刚刚添加了该选项作为 seconf 替代方案。 OPs 的问题对此有点模糊......
  • 我试过 ls -R,我将它重定向到一个文件而不是管道到 wc,这样我就可以看到它走了多远。它仍在运行。所以我想知道是否有最快的方法。
  • 嗯,ls 相当快。可能是您的性能问题正在写入文件吗?请记住,写入文件是一个非常缓慢的过程...
  • 当然,我看到了问题,但进一步放慢速度肯定无济于事 :-) 我怀疑你能找到或实现比ls 命令更快的东西。
猜你喜欢
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2013-07-17
  • 2014-03-29
相关资源
最近更新 更多