将“du”中的所有数字相加

将“du”中的所有数字相加

我们想要计算我们得到的第一个数字du

du -b /tmp/*
6       /tmp/216c6f99-6671-4865-b8bc-7205f5388752_resources
668669  /tmp/hadoop7887078727316788325.tmp
6       /tmp/hadoop-hdfs
42456   /tmp/hive
32786   /tmp/hsperfdata_hdfs
6       /tmp/hsperfdata_hive
32786   /tmp/hsperfdata_root
262244  /tmp/hsperfdata_yarn

所以最终的总和将是

sum=6+668669+6+42456+32786+6+32786+262244


echo $sum

我们如何通过 awk 或 perl oneliner 来做到这一点?

答案1

在 AWK 中:

{ sum += $1 }
END { print sum }

所以

du -b /tmp/* | awk '{ sum += $1 } END { print sum }'

请注意,如果目录本身/tmp有子目录,结果将不正确,因为du会生成目录及其子目录的运行总计。

du -s将为您正确计算总和(在 中的所有子目录和文件上/tmp,包括隐藏的):

du -sb /tmp

并将du -c计算列出的目录和文件的总和,也正确:

du -cb /tmp/*

答案2

您还可以使用 生成所选文件的总数du -c。即使 的参数du不是目录,这也有效,但以下情况则不然du -s

$ du -sb file1 file2
17  file1
18  file2

$ du -cb file1 file2
17  file1
18  file2
35  total

顺便说一句,对于交互式使用,我建议添加-h选项而不是-b或任何其他块大小乘数。这将以人类可读的单位格式打印尺寸。

$ du -ch file1 file2
4.0K    file1
4.0K    file2
8.0K    total

答案3

很简单,您可以使用:

 du -b /tmp/* | awk 'BEGIN{i=0} {i=i+$1} END{print i}'

如果您不使用通配符,如果您使用类似 的目录名称/tmp,那么您需要避免最后一个条目,因为 的输出du -b /tmp如下:

size1 file1
size2 file2
size_total .

所以现在你应该避免最后一个条目,所以使用:

du -b /tmp | awk 'BEGIN{i=0} {if( $2 != "." ){i=i+$1}} END{print i}'

但是您也可以使用-s选项,它会为您计算摘要,然后您不需要添加值,只需打印最后一个值,即:

du -s directory

相关内容