extension summary
This commit is contained in:
125
files/ext-summary
Executable file
125
files/ext-summary
Executable file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user