【问题标题】:How does `ls -lh` round file size?`ls -lh` 如何舍入文件大小?
【发布时间】:2015-10-07 10:45:08
【问题描述】:

我将ls -lh 显示的四舍五入的文件大小值与以字节为单位的原始大小(例如ls -l 显示)进行比较。我很难弄清楚它使用什么算法来进行字节转换。

我的假设是它将单位 K、M、G 解释为

  • (a) 10^3、10^6、10^9 或
  • (b) 1024、1024^2、1024^3。

一方面,我有一个文件,ls -l 报告为 2052 字节,ls -lh 舍入为 2.1K:

$ ls -l usercount.c 
-rw-r--r-- 1 squirrel lsf 2052 May 13 15:41 usercount.c
$ ls -lh usercount.c 
-rw-r--r-- 1 squirrel lsf 2.1K May 13 15:41 usercount.c

这似乎支持假设 (a),因为 2052/1000=2.052 向上舍入为 2.1K,但 2052/1024=2.0039 在四舍五入到小数点后显示为 2.0K。

另一方面,我有另一个文件 ls -l 报告为 7223 字节,ls -lh 显示为 7.1K:

$ ls -l traverse.readdir_r.c
-rw-r--r-- 1 squirrel lsf 7223 Jul 21  2014 traverse.readdir_r.c
$ ls -lh traverse.readdir_r.c
-rw-r--r-- 1 squirrel lsf 7.1K Jul 21  2014 traverse.readdir_r.c

这令人困惑地支持假设 (b),因为 7223/1000=7.223 应向下舍入为 7.2K,但 7223/1024=7.0537 应向上舍入为显示的 7.1K

这使我得出结论,我的假设是错误的,并且它既不是(a)也不是(b)。 ls 使用什么算法来进行这种舍入?

【问题讨论】:

  • 有趣的是,1999 和 2099 的文件都显示为 2.0K
  • 试试看源码

标签: linux unix ls


【解决方案1】:

默认情况下,GNU ls 会以 1024 为单位四舍五入

它不会像您认为理所当然的那样四舍五入。

这是来自gnulib human.h 的格式化标志:

/* Round to plus infinity (default).  */
human_ceiling = 0,

这与您所看到的一切一致:

  • 2052 是 2.0039 KiB,四舍五入为 2.1
  • 7223 是 7.0537 KiB,向上舍入到 7.1

【讨论】:

    【解决方案2】:

    默认情况下,ls 中的块大小为 1024,但例如,如果输出为 44.203125k,它会将其四舍五入为 45k
    你也可以改变它

    ls -lh --block-size=1000
    

    及源代码:ls source code

    【讨论】:

    • 感谢您的回答。我不认为块大小真的会影响它如何决定对数字进行四舍五入。相反,它只是告诉您给定大小字节中包含该文件的最小块数。
    猜你喜欢
    • 2018-01-03
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2015-06-17
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-30
    相关资源
    最近更新 更多