`ls -lh` 如何舍入文件大小?
How does `ls -lh` round file size?
我正在比较 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
使用什么算法进行此舍入?
默认情况下,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
我正在比较 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
使用什么算法进行此舍入?
默认情况下,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