Several years ago I came across this script (below) as a 'bash' script. I believe the comments came from the original as well: BYTES="$@" #MBYTES='1024' MBYTES='1000' # Array of suffixes declare -a METRIC=(' Bytes' 'KB' 'MB' 'GB' 'TB' 'XB' 'PB') # magnitude of 2^10 MAGNITUDE=0 # change this numeric value to increase decimal precision PRECISION="scale=1" # numeric arg val (in bytes) to be converted UNITS=$(echo "$BYTES" | tr -dc '[0-9]') # compares integers (b/c no floats in bash) while [ ${UNITS/.*} -ge ${MBYTES} ] do # floating point math via `bc` UNITS=`echo "$PRECISION; $UNITS/${MBYTES}" | bc` # increments counter for array pointer ((MAGNITUDE++)) done echo "$BYTES bytes" echo "$UNITS ${METRIC[$MAGNITUDE]}" I don't really understand what the 'while' loop is doing, and I don't know if zsh has 'floats' (which I assume is 'floating point'?). So, given my limited knowledge here, I tried to implement the same thing in zsh, and this is what I came up with: BYTES="$@" #MBYTES='1024' MBYTES='1000' PRECISION="scale=2" if [ "$MBYTES" = "1000" ] then METRIC=('KB' 'MB' 'GB' 'TB' 'XB' 'PB') else METRIC=('KiB' 'MiB' 'GiB' 'TiB' 'XiB' 'PiB') fi for BYTES in "$@" do MAGNITUDE=0 UNITS=$(echo "$BYTES" | tr -dc '[0-9]') if [[ "$UNITS" != "" ]] then while [ ${UNITS/.*} -ge $MBYTES ] do UNITS=$(echo "$PRECISION; $UNITS/$MBYTES" | bc) ((MAGNITUDE++)) done echo "$UNITS ${METRIC[$MAGNITUDE]}" fi done Does that look correct to you? Did I miss anything? It appears to work in my (limited, so far) testing, but I'm worried that I'm overlooking something. Alternatively: is there another / easier way of doing this that I should use instead? Some 'zmodload' or something? Thanks for any pointers. Tj -- TJ Luoma TJ @ MacStories Personal Website: luo.ma (aka RhymesWithDiploma.com) Twitter: @tjluoma