【问题标题】:Could get right file size using du可以使用 du 获得正确的文件大小
【发布时间】:2025-11-29 17:50:02
【问题描述】:

我看到我在 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 函数达到同样的效果?

谢谢

【问题讨论】:

  • "标准 Linux 函数" - awk 不算数吗?或者你需要 du 来四舍五入到小数点后 1 位吗?还有numfmt,如果这算得上更标准的话。
  • 实际上不,numfmt 不支持强制小数位(令人讨厌的是它拒绝 --format %.1f :-( ),它为您的示例提供 14G。
  • du 的手册页上写着:'-h''--human-readable' 为每个大小附加一个大小字母,例如“M”表示兆字节。使用的是 1024 的幂,而不是 1000; “M”代表 1,048,576 字节。此选项等效于 --block-size=human-readable。如果您更喜欢 1000 的幂,请使用 --si 选项。
  • @LupusE,我读过,但问题 du round 大小有点奇怪,13.2 -> 14GB。我需要得到一个精确的文件大小。
  • 你的命令应该是'du -sbh ' ...你正在比较'du -sh'(人类可读[1024]中'磁盘上的使用'的总和)和'du -sb(加上 awk)'(来自“文件大小”的总和)。当每个文件的大小不同或不是文件系统块大小的倍数时,“磁盘使用率”会更高。

标签: linux filesize du


【解决方案1】:

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

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

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

我不知道除了awk 之外的任何标准Unix 工具,或者更复杂的东西,如perlpython,它们会以更简单的方式完成此操作。还有其他人正在为此寻找解决方案,而您的解决方案是最好的。

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

【讨论】:

    最近更新 更多