是否有标准工具可以将字节的整数计数转换为人类可读的最大可能单位大小计数,同时将数值保持在 1.00 和 1023.99 之间?
我有我自己的 bash/awk 脚本,但我正在寻找一个标准工具,它可以在许多/大多数发行版中找到......更普遍可用的东西,理想情况下有简单的命令行参数,和/或可以接受管道输入。
以下是我正在寻找的输出类型的一些示例。
1 Byt
173.00 KiB
46.57 MiB
1.84 GiB
29.23 GiB
265.72 GiB
1.63 TiB
Run Code Online (Sandbox Code Playgroud)
这是bytes-human脚本(用于上述输出)
awk -v pfix="$1" -v sfix="$2" 'BEGIN {
split( "Byt KiB MiB GiB TiB PiB", unit )
uix = uct = length( unit )
for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
}{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
num = $1 …Run Code Online (Sandbox Code Playgroud) 我知道交换 - 这个问题不是关于那个。在 dmesg 中,Linux (x86-64) 内核告诉我我有多少内存:
[ 0.000000] Memory: 3890880k/4915200k available (6073k kernel code, 861160k absent, 163160k reserved, 5015k data, 1596k init)
Run Code Online (Sandbox Code Playgroud)
cat /proc/meminfo 告诉我我有
MemTotal: 3910472 kB
Run Code Online (Sandbox Code Playgroud)
根据我的计算,我认为我应该正好有 4*1024*1024=4194304k RAM。这是方式比上面dmesg的行第二个数字小!
所有这些不同的数字是怎么回事?
顺便说一下,uname -a输出:
Linux pavilion 3.2.2-1.fc16.x86_64 #1 SMP Thu Jan 26 03:21:58 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud) 我在 VMware Fusion 10.1.1(在 High Sierra)中运行了几个内核为 4.9.0-5-amd64 的 Debian 9.3 虚拟机。
我担心的是 Free 中的总内存不能正确反映我为多个 VM 预留的内存。
作为测试,我为 VM 预留了 2GB 的空间,但free -m只显示了 1986MB:
$ free -m
total used free shared buff/cache available
Mem: 1986 51 1864 1 70 1825
Run Code Online (Sandbox Code Playgroud)
或没有-m:
$ free
total used free shared buff/cache available
Mem: 2033760 52264 1909584 1108 71912 1869628
Swap: 999420 0 999420
Run Code Online (Sandbox Code Playgroud)
调试情况我也查看/proc/meminfo并发现了这一点:
$ egrep "MemTotal|DirectMap2M" /proc/meminfo
MemTotal: 2033760 kB
DirectMap2M: 2054144 kB
Run Code Online (Sandbox Code Playgroud)
所以实际上 DirectMap2M 反映的是 2GB;为什么有 …