【问题标题】:Fastest Method for Counting Files in Directory Hierarchy在目录层次结构中计算文件的最快方法
【发布时间】:2014-01-19 12:15:06
【问题描述】:

很简单,我想尽快获取目录(以及所有嵌套的子目录)中的文件数。

我知道如何使用 findwc -l 和类似方法配对,但是这些方法非常慢,它们会通过每个目录中的每个文件条目并以这种方式计数。

这是最快的方法,还是有替代方法?例如;我不需要查找特定类型的文件,所以我可以抓取符号链接、隐藏文件等。如果我可以通过计算所有内容而不涉及进一步处理来更快地获得文件计数。

【问题讨论】:

    标签: file shell filesystems


    【解决方案1】:

    最快的方法是使用locate + wc 或类似的。它不能更快​​。该方法的主要缺点是它计算的不是实际文件,而是定位数据库中的文件。这个数据库可能已经有 1 天了。

    所以这取决于你的任务:如果它可以容忍延迟,我更喜欢locate

    在我基于 SSD 的超高速机器上:

    $ time find /usr | wc -l
    156610
    
    real    0m0.158s
    user    0m0.076s
    sys     0m0.072s
    
    $ time locate /usr | wc -l
    156612
    
    real    0m0.079s
    user    0m0.068s
    sys     0m0.004s
    

    在普通机器上,差异会大得多。

    locate 数据库的更新频率取决于主机的配置。 默认情况下,它每天更新(使用cron 制作)。但是您可以配置系统,使脚本每小时甚至频繁地运行一次。当然,您可以不定期运行它,而是按需运行(感谢 William Pursell 的提示)。

    【讨论】:

    • 数据库可以随心所欲地更新,因此您可以使最大过期时间远少于 1 天。
    • @WilliamPursell:当然是的,William,我完全理解这一点,关键是如果您需要更频繁地更新数据库而不是运行find,那么这种方法不再那么好了。
    • 我不是在批评您的解决方案,实际上给了您 +1。但读者可能不知道运行频率是可以修改的。
    • @WilliamPursell:是的,威廉,你是对的(感谢您的 +1)。感谢您的提示,我认为值得在答案中提及。我会添加它。
    【解决方案2】:

    试试这个脚本作为替代:

    find . -type d -exec bash -c 'd="{}"; arr=($d/*); echo "$d:${#arr[@]}"' \;
    

    在我的快速基本测试中,它比wc -l 更快

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2013-02-02
      • 2011-08-30
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多