如何查找文件及其总大小?


12

我想查找一系列文件(基于通配符表达式)并总计其磁盘使用情况。

像这样:

$ 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找到的所有文件的总数。

Answers:


12

通过将选项-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-from选项导致du(1)读取以空分隔的文件名。与换行符不同,空字符可能不会出现在文件名中,因此输出是明确的。

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

$ man du
$ man find

2
如果文件数量由于命令行参数数量限制而很重要(1K +),则最终可能会有多个总数。
ychaouche

我可以确认@ychaouche,在尝试评估超过3万个文件的大小时遇到​​了问题。
阿德里安H

如果出现问题,某些的实现du(1)还支持从文件中读取文件名:find 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames
Witiko

4

尝试这个:

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

原始命令给du一个参数,然后执行它,直到它遍历所有参数为止。这样,您只需一次给它所有的参数,然后减少单独的大小,只剩下总数。您可以根据需要删除管道和尾部以显示每个文件的大小。


使用包含空格的路径名将不会产生正确的结果。正确的方法是使用-exec du -c {} +选项find,该选项会将未更改的路径名传递给du
Witiko 2014年

4

您可以尝试以下方法:

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

2

我将find自己打印出大小,然后使用另一个工具来计算总数:

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

如果您还想查看文件名:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

在大多数系统上,应该可以工作以达到千兆字节总数的一种划线员:

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.