解决方案

解决方案

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

像这样:

$ 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

这个有用。但它没有产生我想要的结果。它列出了每个文件使用的空间,就像find遍历它们一样。

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

答案1

解决方案

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

$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +

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

$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames

解释

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

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

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} \;
    1
    2
    3
    
  • command {} +当所有结果都已检索到时,执行command。传递的是结果的路径名,而不是{}

    $ touch 1 2 3
    $ find  1 2 3 -maxdepth 0 -exec echo {} +
    1 2 3
    

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

要了解有关du(1)和选项的更多信息find(1),您应该查阅相应的手册页:

$ man du
$ man find

答案2

尝试这个:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

原始命令是给 du 一个参数,然后执行它,直到它执行完所有参数。这样,​​您只需一次给它所有参数,然后截断单独的大小,只留下总数。如果您愿意,您可以删除管道和尾部以显示每个文件的大小。

答案3

您可以尝试以下操作:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

答案4

在大多数系统上,有一行代码可以得到 GB 的总数:

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"

相关内容