仅以 GB 为单位输出磁盘大小。仅以千兆字节为单位。
不是 MB。不是兆字节。
不是 TB。不是太字节。
迄今已测试:
sudo blockdev --getsize64 /dev/sda
1000204886016
sudo blockdev --getsize64 /dev/sda |bc -l |awk '{print $1/1000000000}'
1000.2
sudo blockdev --getsize64 /dev/sda |bc -l |awk '{print $1/1000000000}' |numfmt --field=1- --format=%.0f --invalid=ignore
1001
但上面的1001
输出是舍入误差。
1000
是理想输出,即1000 GB
磁盘大小。
问题1:
如何修复上述舍入误差?
问题 2:
与下面的 120 个字符相比,有什么更优雅的方式或更短的方式:
sudo blockdev --getsize64 /dev/sda |bc -l |awk '{print $1/1000000000}' |numfmt --field=1- --format=%.0f --invalid=ignore
。
。
使用:
neofetch --stdout |grep 'OS:'
操作系统:Kubuntu 22.04.3 LTS x86_64
--
答案1
严格来说,这不是舍入误差根据 numfmt 使用的舍入方法,其中有几种。您需要选择所需的舍入行为,可能--round=nearest
是大多数人期望的行为:
--round=METHOD
use METHOD for rounding when scaling; METHOD can be: up,
down, from-zero (default), towards-zero, nearest
但是由于您只想要一个特定的单位(GB),在您使用 awk 完成除法之后,numfmt 在这里完全是多余的——它为您做的就是添加“G”,并且您已经可以从 awk 本身完成此操作,也可以使用 awk 自己的浮点数(甚至整数)格式,其中%.0f
始终使用最接近的舍入(和%d
截断)。
$ blockdev --getsize64 /dev/sda | awk '{printf("%.0f GB\n", $1/1000000000)}'
1000 GB
在您的示例中,这bc -l
似乎是多余的,因为您实际上并没有在“bc”中执行任何操作,但是您可以也可以使用它:
$ sz=$(blockdev --getsize64 /dev/sda); echo "$sz/1000000000" | bc
如果截断(向下舍入)足够好,您还可以在$(( ... ))
或$[...]
(相同但后者是非标准的)内使用 Bash 的整数算法:
$ sz=$(blockdev --getsize64 /dev/sda); echo "$[sz/1000000000]G"