我想找到一系列文件(基于通配符表达式)并计算它们的总磁盘使用量。
像这样:
$ 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-from
会du(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"