#!/bin/bash
# 2020-03-25 show current and average increase of B or bps in a directory - rzm
# 2020-05-21…22 adding 30 s and since start averages, corrections
unset LANG
step=2 #s
mark=60 #s  nulla minuta sine linea
dir=$1
if [ "$1" == "" ]; then dir=.; fi
n=0

while :; do
	sddulong=""
	n=$(( $n + 1 ))
	date=`date +%s.%N`; hdate=`date`
	du=`du -sc "$dir" | tail -1 | awk '{ print $1 }'`
	if [ "$du0" == "" ]; then du0="$du"; fi
	echo | awk -v date="$date" -v hdate="$hdate" -v pdate="$pdate" -v du="$du" -v pdu="$pdu" -v step="$step" -v mark="$mark" -v n="$n" -v pdulong="$pdu15" -v pdutot="$du0" 'BEGIN {
		u[0] = "N"; u[1] = "k"; u[2] = "M"; u[3] = "G"
	}

	function speed(du, pdu, date, pdate	, ddata, ddu, bs, bps, rps, rbps, sddu) {
		ddate = date-pdate; ddu = (du-pdu)*1024
		bs = ddu/ddate; bps = 8*bs
		rbs = int(log(bs)/log(1024)); rbps = int(log(bps)/log(1000))
		if (rbs <= 0) rbs = 1; if (rbps <= 0) rbps = 1
		sddu = sprintf("%#.3g %sB/s  %#.3g %sbps", bs/1024^rbs, toupper(u[rbs]), bps/1000^rbps, u[rbps])
		gsub("\\. ", " ", sddu)
		return sddu
	}

	END {
		ret = "\r"
		if (n mod (mark/step) == 0) ret = "\n"
		sddulong = "  [30 s average]   ";	if (pdulong != "")	sddulong = speed(du, pdulong, date, date - 30)
		sddutot  = "  [since start]    ";	if (n * step > 120-80)	sddutot  = speed(du, pdutot, date, date - n * step)
		if (date-pdate < 1000) printf "%s   %s   %s   %s%s", hdate, speed(du, pdu, date, pdate), sddulong, sddutot, ret
	}'

	if [ `echo "$sdate - $date > $step" | bc -lq` == 1 ]; then
		printf "\n"; sdate="$date"; sdu="$du"
	fi
	sleep "$step"

	# Check for 'q' keypress *waiting very briefly* and exit the loop, if found. # !! BASH 4.x+ ONLY # https://stackoverflow.com/questions/9731281/bash-script-listen-for-key-press-to-move-on
	read -t 0.01 -r -s -N 1 && [[ $REPLY == 'q' ]] && break
	pdate="$date"; pdu30="$pdu29"; pdu29="$pdu28"; pdu28="$pdu27"; pdu27="$pdu26"; pdu26="$pdu25"; pdu25="$pdu24"; pdu24="$pdu23"; pdu23="$pdu22"; pdu22="$pdu21"; pdu21="$pdu20"; pdu20="$pdu19"; pdu19="$pdu18"; pdu18="$pdu17"; pdu17="$pdu16"; pdu16="$pdu15"; pdu15="$pdu14"; pdu14="$pdu13"; pdu13="$pdu12"; pdu12="$pdu11"; pdu11="$pdu10"; pdu10="$pdu9"; pdu9="$pdu8"; pdu8="$pdu7"; pdu7="$pdu6"; pdu6="$pdu5"; pdu5="$pdu4"; pdu4="$pdu3"; pdu3="$pdu2"; pdu2="$pdu"; pdu="$du"
done
