【发布时间】:2015-08-19 13:49:23
【问题描述】:
我正在运行一个脚本来查看目录及其子目录中的所有文件。
脚本已经运行了一天,我想估计它会运行多长时间。我知道到目前为止它处理了多少文件(73,000,000),但我不知道文件总数。
统计文件的最快方法是什么?
我尝试右键单击目录并选择“属性”,它正在慢慢计数。 我尝试将 ls 重定向到一个文件中,它只是在搅动和搅动......
我应该用c写程序吗?
【问题讨论】:
标签: linux performance
我正在运行一个脚本来查看目录及其子目录中的所有文件。
脚本已经运行了一天,我想估计它会运行多长时间。我知道到目前为止它处理了多少文件(73,000,000),但我不知道文件总数。
统计文件的最快方法是什么?
我尝试右键单击目录并选择“属性”,它正在慢慢计数。 我尝试将 ls 重定向到一个文件中,它只是在搅动和搅动......
我应该用c写程序吗?
【问题讨论】:
标签: linux performance
最简单的方法:
find <dir> -type f | wc -l
可能稍微快一点:
find <dir> -type f -printf '\n' | wc -l
【讨论】:
ls 的输出保存到文件要快。它将与ls -R | wc -l 相当。
我做了一个快速的研究。使用包含 100,000 个文件的目录,我比较了以下命令:
ls -R <dir>
ls -lR <dir>
find <dir> -type f
我运行了两次,一次重定向到文件 (>file),一次通过管道传输到 wc (|wc -l)。以下是以秒为单位的运行时间:
>file |wc
ls -R 14 14
find 89 56
ls -lR 91 82
>file 和 |wc -l 之间的差异小于 ls 和 find 之间的差异。
看来ls -R 至少比find 快4x。
【讨论】:
ls -R 可能更快,但它也会给出不正确的结果。首先,这包括目录和文件。更糟糕的是,输出被格式化,并且那些格式化行也被计算在内。
我知道的最快的:
ls | wc -l
注意:请记住,尽管它列出了目录中的所有节点,包括子目录以及对当前目录和父目录的两个引用(. 和..)。
如果您需要所有子目录中的文件递归计数(而不是包括当前目录中的子目录在内的所有内容),那么您可以将“递归”标志添加到ls 命令:
ls -R | wc -l
如果您将此速度与使用 find 的建议进行比较,您会发现它要快得多(因子 2 到 10),但请记住上面的注释。
【讨论】:
ls 相当快。可能是您的性能问题正在写入文件吗?请记住,写入文件是一个非常缓慢的过程...
ls 命令更快的东西。