Skip to content

Instantly share code, notes, and snippets.

@jpluimers
Created December 14, 2017 21:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jpluimers/0f21bf1d937fe0b9b4044f21944a90ec to your computer and use it in GitHub Desktop.
Save jpluimers/0f21bf1d937fe0b9b4044f21944a90ec to your computer and use it in GitHub Desktop.
bash script to convert numbers (usually bytes) to IEC or SI human readable format
#!/bin/bash
# bytesToHuman based on https://unix.stackexchange.com/questions/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc-like-du-ls1/259254#259254
# units from wikipedia (note I had to re-order Z and Y):
# - https://en.wikipedia.org/wiki/Binary_prefix
# - https://en.wikipedia.org/wiki/File_size
# - https://en.wikipedia.org/wiki/ISO/IEC_80000#Information_science_and_technology
# test cases from https://www.alteeve.com/w/IEC_and_SI_Size_Notations and https://en.wikipedia.org/wiki/File_size
# 64-bibt checks at https://superuser.com/questions/1030122/what-is-the-maximum-value-of-a-numeric-bash-shell-variable/1030129#1030129
bytesToHumanIEC() {
b=${1:-0}; d=''; s=0; S=(Bytes {K,M,G,T,E,P,Z,Y}iB)
while ((b > 1024)); do
d="$(printf ".%02d" $((b % 1024 * 100 / 1024)))"
b=$((b / 1024))
let s++
done
echo "$b$d ${S[$s]}"
}
bytesToHumanSI() {
b=${1:-0}; d=''; s=0; S=(Bytes {k,M,G,T,E,P,Z,Y}B)
while ((b > 1000)); do
d="$(printf ".%02d" $((b % 1000 * 100 / 1000)))"
b=$((b / 1000))
let s++
done
echo "$b$d ${S[$s]}"
}
# test cases
echo bytesToHumanIEC test cases:
bytesToHumanIEC 0
bytesToHumanIEC 1023
bytesToHumanIEC 1048575
bytesToHumanIEC 1073741823
bytesToHumanIEC 1099511627775
bytesToHumanIEC 1125899906842623
bytesToHumanIEC 1152921504606846975
## These are likekly not supported as they overflow on 64-bit systems:
bytesToHumanIEC 1180591620717411303423
bytesToHumanIEC 1208925819614629174706175
bytesToHumanIEC 1
bytesToHumanIEC 1024
bytesToHumanIEC 1048576
bytesToHumanIEC 1073741824
bytesToHumanIEC 1099511627776
bytesToHumanIEC 1125899906842624
bytesToHumanIEC 1152921504606846976
bytesToHumanIEC 1180591620717411303424
bytesToHumanIEC 1208925819614629174706176
bytesToHumanIEC 2
bytesToHumanIEC 1025
bytesToHumanIEC 1048577
bytesToHumanIEC 1073741825
bytesToHumanIEC 1099511627777
bytesToHumanIEC 1125899906842625
bytesToHumanIEC 1152921504606846977
bytesToHumanIEC 1180591620717411303425
bytesToHumanIEC 1208925819614629174706177
bytesToHumanIEC 0
bytesToHumanIEC 1999
bytesToHumanIEC 1999999
bytesToHumanIEC 1999999999
bytesToHumanIEC 1999999999999
bytesToHumanIEC 1999999999999999
bytesToHumanIEC 1999999999999999999
bytesToHumanIEC 1999999999999999999999
bytesToHumanIEC 1999999999999999999999999
bytesToHumanIEC 1
bytesToHumanIEC 1000
bytesToHumanIEC 1000000
bytesToHumanIEC 1000000000
bytesToHumanIEC 1000000000000
bytesToHumanIEC 1000000000000000
bytesToHumanIEC 1000000000000000000
## These are likekly not supported as they overflow on 64-bit systems:
bytesToHumanIEC 1000000000000000000000
bytesToHumanIEC 1000000000000000000000000
bytesToHumanIEC 1
bytesToHumanIEC 1001
bytesToHumanIEC 1000001
bytesToHumanIEC 1000000001
bytesToHumanIEC 1000000000001
bytesToHumanIEC 1000000000000001
bytesToHumanIEC 1000000000000000001
bytesToHumanIEC 1000000000000000000001
bytesToHumanIEC 1000000000000000000000001
echo bytesToHumanSI test cases:
bytesToHumanSI 1
bytesToHumanSI 1024
bytesToHumanSI 1048576
bytesToHumanSI 1073741824
bytesToHumanSI 1099511627776
bytesToHumanSI 1125899906842624
bytesToHumanSI 1152921504606846976
bytesToHumanSI 1180591620717411303424
bytesToHumanSI 1208925819614629174706176
bytesToHumanSI 1
bytesToHumanSI 1000
bytesToHumanSI 1000000
bytesToHumanSI 1000000000
bytesToHumanSI 1000000000000
bytesToHumanSI 1000000000000000
bytesToHumanSI 1000000000000000000
bytesToHumanSI 1000000000000000000000
bytesToHumanSI 1000000000000000000000000
bytesToHumanSI 0
bytesToHumanSI 1023
bytesToHumanSI 1048575
bytesToHumanSI 1073741823
bytesToHumanSI 1099511627775
bytesToHumanSI 1125899906842623
bytesToHumanSI 1152921504606846975
bytesToHumanSI 1180591620717411303423
bytesToHumanSI 1208925819614629174706175
bytesToHumanSI 1
bytesToHumanSI 1024
bytesToHumanSI 1048576
bytesToHumanSI 1073741824
bytesToHumanSI 1099511627776
bytesToHumanSI 1125899906842624
bytesToHumanSI 1152921504606846976
bytesToHumanSI 1180591620717411303424
bytesToHumanSI 1208925819614629174706176
bytesToHumanSI 2
bytesToHumanSI 1025
bytesToHumanSI 1048577
bytesToHumanSI 1073741825
bytesToHumanSI 1099511627777
bytesToHumanSI 1125899906842625
bytesToHumanSI 1152921504606846977
bytesToHumanSI 1180591620717411303425
bytesToHumanSI 1208925819614629174706177
bytesToHumanSI 0
bytesToHumanSI 1999
bytesToHumanSI 1999999
bytesToHumanSI 1999999999
bytesToHumanSI 1999999999999
bytesToHumanSI 1999999999999999
bytesToHumanSI 1999999999999999999
bytesToHumanSI 1999999999999999999999
bytesToHumanSI 1999999999999999999999999
bytesToHumanSI 1
bytesToHumanSI 1000
bytesToHumanSI 1000000
bytesToHumanSI 1000000000
bytesToHumanSI 1000000000000
bytesToHumanSI 1000000000000000
bytesToHumanSI 1000000000000000000
bytesToHumanSI 1000000000000000000000
bytesToHumanSI 1000000000000000000000000
bytesToHumanSI 1
bytesToHumanSI 1001
bytesToHumanSI 1000001
bytesToHumanSI 1000000001
bytesToHumanSI 1000000000001
bytesToHumanSI 1000000000000001
bytesToHumanSI 1000000000000000001
bytesToHumanSI 1000000000000000000001
bytesToHumanSI 1000000000000000000000001
@jpluimers
Copy link
Author

1073758208 is now shown as MiB but looks better as GiB (is more consistent with btrfs too, see nachoparker/btrfs-du#6 )

@Camusensei
Copy link

You have inverted exa and peta: E,P should be P,E

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment