使用bash KB到MB

Lur*_*rch 4 bash shell

我使用命令来获取远程文件夹的大小,在它运行后返回

120928312 http://blah.com
Run Code Online (Sandbox Code Playgroud)

数字是以字节为单位的大小.我想做的是以MB输出,并http删除部分.我猜对文件很好,但不知道如何去做.

tec*_*rus 13

你可以用shell builtins做到这一点

some_command |while read KB dummy;do echo $((KB/1024))Mb;done
Run Code Online (Sandbox Code Playgroud)

这是一个更有用的版本:

#!/bin/sh
human_print(){
while read B dummy; do
  [ $B -lt 1024 ] && echo ${B} bytes && break
  KB=$(((B+512)/1024))
  [ $KB -lt 1024 ] && echo ${KB} kilobytes && break
  MB=$(((KB+512)/1024))
  [ $MB -lt 1024 ] && echo ${MB} megabytes && break
  GB=$(((MB+512)/1024))
  [ $GB -lt 1024 ] && echo ${GB} gigabytes && break
  echo $(((GB+512)/1024)) terabytes
done
}

echo 120928312 http://blah.com | human_print
Run Code Online (Sandbox Code Playgroud)


Ken*_*ent 6

这条线怎么样:

$ echo "120928312 http://blah.com" | awk '{$1/=1024;printf "%.2fMB\n",$1}'
118094.05MB
Run Code Online (Sandbox Code Playgroud)


sw1*_*1nn 6

function bytes_for_humans {
    local -i bytes=$1;
    if [[ $bytes -lt 1024 ]]; then
        echo "${bytes}B"
    elif [[ $bytes -lt 1048576 ]]; then
        echo "$(( (bytes + 1023)/1024 ))KiB"
    else
        echo "$(( (bytes + 1048575)/1048576 ))MiB"
    fi
}

$ bytes_for_humans 1
1 Bytes
$ bytes_for_humans 1024
1KiB
$ bytes_for_humans 16777216
16MiB
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 5

尝试使用 builtins 执行此操作(显示类似KB版本的整数)

var="120928312 http://blah.com"
echo "$(( ${var%% *} / 1024)) MB"
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记 shell 使用整数数学,所以 (X+512)/1024 来获得适当的舍入......我在答案中也忽略了这部分 (2认同)

Acu*_*nus 5

使用bcprintf

bc并可printf用于显示具有可配置小数位数的输出,还可以对数字进行分组:

$ KB=1234567890
$ echo "$KB / 1000" | bc -l | xargs -i printf "%'.1f MB" {}
1,234,567.9 MB
Run Code Online (Sandbox Code Playgroud)

使用numfmt

用于numfmt自动缩放输出单位:

$ numfmt --from=iec --to=si 123456789K
127G
$ numfmt --from=si --to=iec 123456789K
115G
Run Code Online (Sandbox Code Playgroud)

用于numfmt输出到固定单位,例如M

$ numfmt --from=iec --to-unit=1M --grouping 123456789K
126,420

$ numfmt --from=si --to-unit=1Mi --grouping 123456789K
117,738
Run Code Online (Sandbox Code Playgroud)

请参阅其手册页并确保正确使用它。