可以使用du获得正确的文件大小

时间:2018-10-11 12:05:24

标签: linux filesize 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功能获得相同的结果?

谢谢

1 个答案:

答案 0 :(得分:1)

du最初用于查找文件在存储介质(磁盘)上占用多少空间。这就是为什么舍入而不舍入的主要原因。即使已使用了其中的两个字节,已启动的已分配块也始终被完全“使用”。

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

接下来的事情是,您想要将14204477032之类的大量数字转换为13.2GB之类的简洁版本。您还需要在评论中指出14G(可能会产生-h)不够精确,无法满足您的口味,并且 您还提供了awk脚本,完全进行此转换,以便您已经有了可行的解决方案。

awk之外,我什至没有其他标准的Unix工具,甚至还没有更复杂的东西,例如perlpython,它们会以一种更为简单的方式来实现。还有其他人正在寻找解决方案,而您就是最好的解决方案之一。

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

相关问题