首页 > 解决方案 > 可以使用 du 获得正确的文件大小

问题描述

我看到我在 aws s3 存储上的存储桶大小为 13.2GiB,它有 1570 个文件:

$ aws s3 ls --summarize --human-readable s3://mybucket/ | grep -E "(Total\sObjects|Total\sSize)"
Total Objects: 1570
   Total Size: 13.2 GiB

当我下载这个存储桶时,我看到的是:

$du -sh ./test
14G
$wc -l ./test
1570
$ du -sb ./test
14204477032
$ du -sb ./test | awk '{ \
            split( "B KB MB GB" , v ); \
            s=1; \
            while( $1>=1024 ) { \
                $1/=1024; s++ \
            } \
            printf "%.1f%s", $1, v[s] \
        }'
13.2GB

如何使用标准 Linux 函数实现相同的结果?

谢谢

标签: linuxfilesizedu

解决方案


du最初是为了找出一个文件在存储介质(磁盘)上占用了多少空间。这就是为什么它宁愿向上舍入而不是向下舍入的主要原因。一个开始分配的块总是被完全“使用”,即使它只有两个字节在使用。

您的情况似乎旨在计算文件中的字节数,而不管它们占用的存储空间如何。为此,du有选项--apparent-size。然后显示文件的大小,而不是磁盘使用情况。结合--block-size=1这个更简单的拼写为-b

接下来的事情是你想将一个大数字转换14204477032成一个整洁的版本,比如13.2GB. 您还在评论中指出14G(如-h将产生的那样)对于您的口味来说不够精确,并且您提供了一个awk脚本,该脚本可以进行这种转换,以便您已经有了一个可行的解决方案。

我不知道有任何标准的 Unix 工具awk,甚至更复杂的东西,比如perl或者python更容易做到这一点的东西。还有其他人正在为此寻找解决方案,而您的解决方案是最好的。

所以我的建议就是:坚持你的解决方案。我建议的唯一改进是使用位移 ( >> 10) 而不是除法 ( / 1024),但这只是个人喜好问题。


推荐阅读