7

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

120928312 http://blah.com

该数字是以字节为单位的大小。我想做的是让它以MB输出,并http删除部分。我猜是对文件的 greping,但不知道该怎么做。

4

7 回答 7

16

你可以用 shell 内置函数来做到这一点

some_command | while read KB dummy;do echo $((KB/1024))MB;done

这是一个更有用的版本:

#!/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
于 2013-09-27T21:07:11.243 回答
8

这条线怎么样:

$ echo "120928312 http://blah.com" | awk '{$1/=1024;printf "%.2fMB\n",$1}'
118094.05MB
于 2013-09-27T21:04:10.240 回答
6

内置函数执行此操作(显示类似于 KB 版本的整数)

var="120928312 http://blah.com"
echo "$(( ${var%% *} / 1024)) MB"
于 2013-09-27T21:05:10.843 回答
4
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
于 2015-06-16T16:03:07.687 回答
2

使用bcprintf

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

$ KB=1234567890
$ echo "$KB / 1000" | bc -l | xargs -i printf "%'.1f MB" {}
1,234,567.9 MB

使用numfmt

要使用numfmt自动缩放输出单元:

$ numfmt --from=iec --to=si 123456789K
127G
$ numfmt --from=si --to=iec 123456789K
115G

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

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

$ numfmt --from=si --to-unit=1Mi --grouping 123456789K
117,738

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

于 2020-11-08T20:08:18.487 回答
1

尝试使用awk

awk '{MB=$1/1024; print $MB}'

$1- 在这种情况下,第一列的值,大小 (KB)

于 2013-09-27T21:10:50.810 回答
0

Github:index0-b-to-mb.sh

index0-b-to-mb.sh

    #! /bin/bash --posix

    # requirements: vim-common
    # sudo dnf -y install vim-common

    function b_to_mb {
      # get BASE conversion type
      if [ "$3" = "BASE10" ]; then
        # set for BASE10
        BASE_DIV=1000000
      else
          if [ "$3" = "MIXED" ]; then
          # set for MIXED
          BASE_DIV=1024000
          else
          # set default for BASE2
          BASE_DIV=1048576
          fi
      fi
      # create array from string
      # use bc with 6 digit precision to calculate megabytes from bytes
      ARRAY=($1) && printf "scale=6; ${ARRAY[0]}/$BASE_DIV\n" | bc -l
    }
    # execute b_to_mb
    b_to_mb $1 $2

https://en.wikipedia.org/wiki/Megabyte#Definitions

./index0-b-to-mb.sh '120928312 http://blah.com' MIXED

118.094054

./index0-b-to-mb.sh '120928312 http://blah.com' BASE10

120.928312

./index0-b-to-mb.sh '120928312 http://blah.com' BASE2

115.326225

./index0-b-to-mb.sh '120928312 http://blah.com'

115.326225

./index0-b-to-mb.sh "$(your_command)"

115.326225
于 2022-02-05T15:28:18.460 回答