“ls -lh”命令如何对文件大小进行四舍五入?

4
我正在比较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。 - Kevin
4
尝试查看源代码 - Kevin
3个回答

5

GNU ls默认会按1024字节为单位进行向上取整

它不会像你想象的那样四舍五入到最近的单位。

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

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

这与你所看到的一致:

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

1

默认情况下,ls 命令的块大小为1024,但例如如果输出为44.203125k,则会将其四舍五入为45k。
您也可以进行更改。

ls -lh --block-size=1000

和源代码:ls源代码


1
谢谢你的回答。我认为块大小并不会影响它如何决定舍入数字,而只是告诉它给你包含文件的给定大小字节的最小块数。 - Squirrel

0
只列出文件名和整个大小:
ls -s --block-size=1

这是一个简化版本,以列出文件的形式:
ls -x -s --block-size=1 *.*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接