代码之家  ›  专栏  ›  技术社区  ›  Squirrel

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

  •  4
  • Squirrel  · 技术社区  · 11 年前

    我正在比较 ls -lh 原始大小(以字节为单位) ls -l 例如)。我很难弄清楚它使用什么算法从字节进行转换。

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

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

    一方面,我有一份文件 ls-l 报告为2052字节,以及 ls-左侧 循环至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-左侧 显示为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 用来做这个舍入?

    2 回复  |  直到 6 年前
        1
  •  5
  •   that other guy    11 年前

    默认情况下,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
  •  1
  •   Fattaneh Talebi    11 年前

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

    ls -lh --block-size=1000
    

    以及源代码: ls source code