如何查找文件并合计它们的大小?

Pau*_*aul 12 linux bash

我想找到一系列文件(基于通配符表达式)并汇总它们的磁盘使用量。

像这样的东西:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log
Run Code Online (Sandbox Code Playgroud)

这项工作。但它不会产生我正在寻找的结果。它列出了每个文件使用的空间,就像find遍历它们一样。

我想要的是du找到的所有文件的总数。

Wit*_*iko 12

解决方案

通过向 提供选项-c(或--totaldu(1),您可以指示它生成总计。如果您的实现du(1)支持这些选项中的任何一个,则可以使用以下命令实现所需的效果:

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,如果文件数超过系统允许的最大参数数,find仍可能执行command多次。的一些实现du(1)还支持从文件中读取文件名,不受上述限制的影响:

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
Run Code Online (Sandbox Code Playgroud)

解释

-exec command {} \;和的语义区别-exec command {} +如下:

  • command {} \;command对 的每个结果执行一次find。结果的路径名被传递而不是{}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
    Run Code Online (Sandbox Code Playgroud)
  • command {} +执行command,当所有结果都被检索。结果的路径名被传递而不是{}.

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    
    Run Code Online (Sandbox Code Playgroud)

-print0选项导致find(1)将找到的文件名打印到由空字符分隔的标准输出,并且该--files0-from选项导致du(1)读取空分隔的文件名。与换行符不同,空字符可能不会出现在文件名中,因此输出是明确的。

要了解更多有关的选项du(1)find(1),您应该咨询各自的联机帮助页:

$ man du
$ man find
Run Code Online (Sandbox Code Playgroud)

  • 如果由于命令行参数的数量限制,文件数量很重要(1K+),您最终可能会得到多个总数。 (2认同)