Сумма размеров файлов, которые содержат K, M, G, T - PullRequest
4 голосов
/ 06 января 2012

Если (в zsh) у меня есть массив, который содержит что-то вроде этого:

echo ${fsizes[@]}
9.5M 100M 5G 15G 1.2T

Есть ли простой способ получить их сумму в выбранном виде (т. Е. Байты, мегабайты, гигабайты и т. Д.)

1 Ответ

5 голосов
/ 07 января 2012
#!/bin/zsh

fsizes=( 9.5M 100M 5G 15G 1.2T )

typeset -A unit
unit=( B 1 K 1024 M 1048576 G 1073741824 T 1099511627776 )

sumSize(){
    sum=0
    for sz; do
        u=${sz//[^BKMGT]/}
        n=${sz//$u/}
        b=${unit[$u]}
        (( sum += b * n ))
    done
    out="${@:(-1)}"
    echo "Sum is $(( sum / ${unit[$out]} )) $out"
}

Пример с выводом в байтах

$ sumSize ${fsizes[@]} "B"
Sum is 1341003608883.2 B

Пример с выводом в килобайтах

$ sumSize ${fsizes[@]} "K"
Sum is 1309573836.8 K

Пример с выводом в мегабайтах

$ sumSize ${fsizes[@]} "M"
Sum is 1278880.7 M

Пример с выводом в гигабайтах

$ sumSize ${fsizes[@]} "G"
Sum is 1248.90693359375 G

Пример с выводом в терабайтах

$ sumSize ${fsizes[@]} "T"
Sum is 1.2196356773376464 T
...