#!/usr/bin/env zsh # convert sizes in bits/bytes/kbytes/etc to human-readable strings typeset -i sindex suffices=( 'b' 'kb' 'mb' 'gb' 'tb' 'pb' 'eb' 'zb' 'yb' ) [[ -z $(echo $1 | grep --extended-regexp '^[0-9]*([kmgtpezy]{0,1}b){0,1}$') ]] && return 1 val=$(echo $1 | grep -o '^[0-9]*'); suf=$(echo $1 | grep -o --extended-regexp '([kmgtpezy]{0,1}b){0,1}$'); if [[ "$suf" == "" ]]; then if [[ $(echo $val / 8 | bc) -ne 0 ]]; then val=$(echo "scale=2; $val / 8" | bc) else echo $val return 0; fi fi sindex=1 for ((i=1; i <= ${#suffices}; i++)) do [[ "$suf" == "${suffices[$i]}" ]] && let sindex=i done while [[ $(echo $val / 1000 | bc) -ne 0 ]]; do val=$(echo "scale=2; $val / 1000" | bc) let sindex=sindex+1 done echo "${val}${suffices[$sindex]}"