`ls -lh` 如何舍入文件大小?

How does `ls -lh` round file size?

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

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

一方面,我有一个文件 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 使用什么算法进行此舍入?

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

ls -lh --block-size=1000

和源代码:ls source code

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