需要将字节转换为正常十进制格式的 GB、MB、KB

ram*_*amp 12 linux shell-script

我有以下给定的代码,用于将字节转换为相应的值:

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
Run Code Online (Sandbox Code Playgroud)

该逻辑似乎完美运行,但当遇到 时gb (RETURNSIZE),结果为指数格式。

但我正在寻找正常十进制格式的结果。

xen*_*oid 20

由于这是 Linux,我很惊讶没有人提到这个numfmt命令:

numfmt - 将数字从/转换为人类可读的字符串

>>numfmt --to iec --format "%8.4f" 599511627776
558.3388G
Run Code Online (Sandbox Code Playgroud)

  • 从标准输出转换第一列的示例:`echo -e "1024 1048576\n1048576 1024 " | numfmt --to iec` (2认同)

Pes*_*hke 6

我没有测试过,但我认为这与你加载 bc mathlib 与bc -l.

尝试将awkGB的计算部分更改为:

awk '{ byte =$1 /1024/1024/1024; print byte " GB" }'

注意:1024/1024**2相当于1024/1024/1024in awk