我有下面给定的代码,用于将字节转换为相应的值:
for OUTPUT in $(find $IP_DIR -maxdepth 1 | awk 'NR>1')
do
case $RETURNSIZE in
"gb") FS=`du -b $OUTPUT | awk {'print $1'}`
FS=`echo $FS | awk '{ byte =$1 /1024/1024**2 ; print byte " GB" }'`
echo $OUTPUT "|" $FS;;
"mb") FS=`du -b $OUTPUT | awk {'print $1'}`
FS=`echo $FS | awk '{ byte =$1 /1024/1024 ; print byte " MB" }'`
echo $OUTPUT "|" $FS;;
"kb") FS=`du -b $OUTPUT | awk {'print $1'}`
FS=`echo $FS | awk '{ byte =$1 /1024 ; print byte " KB" }'`
echo $OUTPUT "|" $FS;;
"b") FS=`du -b $OUTPUT | awk {'print $1'}`
echo $OUTPUT "|" $FS "B";;
esac
OUTPUT
/home/work/exten.sh | 3.53903e-07 GB
/home/work/e.txt | 0 GB
/home/work/t.txt | 0 GB
/home/worktest | 9.53674e-07 GB
/home/work/s.txt | 3.23169e-07 GB
这个逻辑似乎很完美,但是当情况达到 时gb (RETURNSIZE)
,结果是指数格式的。
但我正在寻找正常十进制格式的结果。
答案1
由于这是 Linux,我很惊讶没有人提到这个numfmt
命令:
numfmt - 将数字转换为人类可读的字符串
>>numfmt --to iec --format "%8.4f" 599511627776
558.3388G
答案2
我没有测试过,但我认为这与您使用 加载 bc mathlib 有关bc -l
。
尝试将awk
GB 的计算部分更改为:
awk '{ byte =$1 /1024/1024/1024; print byte " GB" }'
注:1024/1024**2
相当于1024/1024/1024
中awk
。
答案3
> printf "1GiB\\nMB" | units
Currency exchange rates from finance.yahoo.com on 2017-10-31
3047 units, 109 prefixes, 109 nonlinear units
You have: You want: * 1073.7418
/ 0.00093132257
You have:
或者
> echo $((1024*1024*1024))
1073741824
>
也可以看看:人 7 单位
华泰
答案4
为此做了一个小cli。
https://github.com/gonejack/hsize
> hsize 123 45678
123 => 123B
45678 => 44.61KB
> echo 19129219219129119 | hsize
19129219219129119 => 16.99PB