unix 如何`ls -lh` round文件大小?

zmeyuzjn  于 2023-10-18  发布在  Unix
关注(0)|答案(3)|浏览(189)

我将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使用什么算法来进行舍入?

oknrviil

oknrviil1#

GNU ls默认情况下将以 1024 为单位进行 * 舍入 *。
它不会像你认为的那样,四舍五入到最近。
下面是gnulibhuman.h中的格式化标志:

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

这和你看到的一切都是一致的

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

inkz8wg92#

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

ls -lh --block-size=1000

源代码:ls source code

falq053o

falq053o3#

仅列出文件名和整个大小:

ls -s --block-size=1

这是一个有点简化的版本,列中列出文件:

ls -x -s --block-size=1 *.*

相关问题