diff --git a/files/fastdu b/files/fastdu index c3546b9..b7c4807 100755 --- a/files/fastdu +++ b/files/fastdu @@ -8,7 +8,7 @@ function helpexit() { echo " --help This help" exit } -function filesize { +function filesize() { # Return a human readable size from integer of bytes # Usage: filesize 10000 @@ -18,7 +18,7 @@ function filesize { } awk 'BEGIN{ x = '$1' - split("B KB MB GB TB PB EB ZB",type) + split("B kB MB GB TB PB EB ZB",type) for(i=7;y < 1;i--) y = x / (2^(10*i)) str=int(y*10)/10 " " type[i+2] @@ -26,6 +26,41 @@ function filesize { print str }' || return $? } +function siprefix() { +# Return a SI prefixed string from integer + + [ "$1" = "0" ] && { + echo "0" + return 0 + } + + awk 'BEGIN{ x = '$1' + split("_ k M G T P E Z",type) + for(i=7;y < 1;i--) + y = x / (10^(3*i)) + str=int(y*10)/10 " " type[i+2] + if (x==0) { str = "0" } + if (i==-1) { str = x } + print str + }' || return $? +} + + +function processfolder() { + if [[ "$COUNT" -eq 1 ]]; then + countfiles "$@" + else + displaysize "$@" + fi +} + +function countfiles() { + SIZE=$( find "$@" -type f -printf %s"\n" | awk '{ sum += 1 } END { print int(sum)+0 }' ) + [[ "$HUMAN" -eq 1 ]] && { + SIZE=$( siprefix "$SIZE" ) + } + echo "${SIZE}" +} function displaysize() { SIZE=$( find "$@" -type f -printf %s"\n" | awk '{ sum += $1 } END { print int(sum)+0 }' ) @@ -40,6 +75,7 @@ what=() for (( i=1; i<=$#; i++ )); do [[ "${!i}" = "--help" ]] && helpexit [[ "${!i}" = "-h" ]] && { HUMAN=1; continue; } + [[ "${!i}" = "-c" ]] && { COUNT=1; continue; } [[ "${!i}" = "-s" ]] && { SUMMARY=1; continue; } what+=( "${!i}" ) done @@ -49,11 +85,11 @@ done if [[ "$SUMMARY" -eq 1 ]]; then # Display one line - displaysize "${what[@]}" + processfolder "${what[@]}" else # One size for each argument for dir in "${what[@]}"; do - printf "%s\t%s\n" "$( displaysize "$dir" )" "$dir" + printf "%s\t%s\n" "$( processfolder "$dir" )" "$dir" done fi