我使用命令获取远程文件夹的大小,运行后返回
120928312 http://blah.com
该数字是以字节为单位的大小。我想做的是让它以MB输出,并http
删除部分。我猜是对文件的 greping,但不知道该怎么做。
你可以用 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
这条线怎么样:
$ echo "120928312 http://blah.com" | awk '{$1/=1024;printf "%.2fMB\n",$1}'
118094.05MB
尝试使用bash内置函数执行此操作(显示类似于 KB 版本的整数)
var="120928312 http://blah.com"
echo "$(( ${var%% *} / 1024)) MB"
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
bc
和printf
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
请参阅其手册页并确保正确使用它。
尝试使用awk
awk '{MB=$1/1024; print $MB}'
$1
- 在这种情况下,第一列的值,大小 (KB)
Github: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