diff --git a/bin/ext-summary b/bin/ext-summary new file mode 120000 index 0000000..4814186 --- /dev/null +++ b/bin/ext-summary @@ -0,0 +1 @@ +../files/ext-summary \ No newline at end of file diff --git a/files/ext-summary b/files/ext-summary new file mode 100755 index 0000000..8830d5a --- /dev/null +++ b/files/ext-summary @@ -0,0 +1,125 @@ +#!/bin/bash + +function helpexit() { + echo "Display extension sizes and counts" + echo "Returns only the size as number" + echo " --help This help" + echo " -a Disable animation while counting" + exit +} +function filesize() { +# Return a human readable size from integer of bytes +# Usage: filesize 10000 + + [ "$1" = "0" ] && { + echo "0~B" + return 0 + } + + awk 'BEGIN{ x = '$1' + split("B kB MB GB TB PB EB ZB", type) + for(i=7;y < 1;i--) + y = x / (2^(10*i)) + if (i==-1) { printf( "%d~B", x) } + if (i>-1) { printf( "%0.1f%s", y, type[i+2]) } + }' || 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)) + if (i==-1) { printf( "%d~#", x) } + if (i>-1) { printf( "%0.1f%s", y, type[i+2]) } + }' || return $? +} + +function animate() { + CHARS=( \ + '\_(".)_/' \ + '\_(.")_/' \ + '\_(".)_/' \ + '\_(.")_/' \ + "\_('')_/" \ + '\_(..)_/' \ + "\_('')_/" \ + "\_('')_/" \ + ) + i=0 + while true; do + sleep 1.5 + printf "\r %s\r" "${CHARS[$i]}" >&2 + i=$(( (i + 1)%${#CHARS[@]} )) + done +} + +function processfolders() { + + printf "%8s %8s %-10s\n" \ + Size \ + Count \ + Name + + find "$@" -type f \ + -printf "%s|%P\n" 2>/dev/null | awk ' + BEGIN { FS = "|" } + { + n = split($2, fname, "/"); + if (index(fname[n], ".") > 1) { + n = split(fname[n], fsplit, "."); + ext = "."tolower(fsplit[n]) + } else { + ext = "N/A" + } + sum[ext] += $1; + count[ext] += 1; + } + END { + for (e in sum) { + print sum[e]"|"count[e]"|"e + } + }' | sort -n -k 1 -t\| | while read line; do + IFS='|' read -r -a array <<< "$line" + + printf "%8s %8s %-10s\n" \ + $( filesize "${array[0]}" ) \ + $( siprefix "${array[1]}" ) \ + "${array[2]}" + done | sed -e 's,~B, B,' -e 's,~#, #,' + +} + +# Get options +what=() +ANIMATE=1 +for (( i=1; i<=$#; i++ )); do + [[ "${!i}" = "--help" ]] && helpexit + [[ "${!i}" = "-"* ]] && { + [[ "${!i}" =~ -.*a ]] && { ANIMATE=0; } + [[ "${!i}" =~ -.*h ]] && { helpexit; } + continue + } + what+=( "${!i}" ) +done + +[[ -z "${what[@]}" ]] && what="." + +if [[ "$ANIMATE" -eq 1 ]]; then + trap 'trap - SIGTERM && kill -- -$$' EXIT SIGINT SIGTERM + animate & +fi + +processfolders "${what[@]}" + +if [[ "$ANIMATE" -eq 1 ]]; then + trap - EXIT SIGINT SIGTERM + kill %1 +fi +