domingo, 8 de diciembre de 2013

Función para sh "Bytes to Human Readable" (bytestohr)

El otro día estaba escribiendo un script en el que quería mostrar en pantalla, entre otras cosas, la cantidad de información traspasada por rsync entre dos máquinas. La cantidad la tenía en bytes y me interesaba mostrarla en KB, MB o GB.

Dicen que reinventar la rueda es una pérdida de tiempo, así que me puse a buscar alguna función en sh que lo hiciese. Y me tropecé con esta: bytestohr escrita en ksh.

Tras unos pequeños ajustes para que funcionase en sh, aquí va:

bytestohr()
{
    # Convert input parameter (number of bytes)
    # to Human Readable form
    #
    SLIST="bytes,KB,MB,GB,TB,PB,EB,ZB,YB"

    POWER=1
    VAL=$( echo "scale=2; $1 / 1" | bc)
    VINT=$( echo $VAL / 1024 | bc )
    while [ $VINT -gt 0 ]
    do
        POWER=$(expr $POWER + 1)
        VAL=$( echo "scale=2; $VAL / 1024" | bc)
        VINT=$( echo $VAL / 1024 | bc )
    done

    echo $VAL $( echo $SLIST | cut -f $POWER -d, )
}

Como cualquier otra función en sh, la forma de llamarla es la siguiente:

$ bytestohr 65456456
62.42 MB

Simple pero efectiva.