145 lines
2.8 KiB
Bash
Executable file
145 lines
2.8 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
COLOR_DIR="\033[38;5;39m"
|
|
COLOR_DIRMARK="\033[38;5;242m"
|
|
COLOR_QUIET="\033[38;5;238m"
|
|
|
|
COLOR_RESET="\033[0m"
|
|
|
|
PCT_COLORS="
|
|
90:\033[38;5;196m
|
|
80:\033[38;5;160m
|
|
70:\033[38;5;202m
|
|
60:\033[38;5;214m
|
|
50:\033[38;5;220m
|
|
40:\033[38;5;226m
|
|
30:\033[38;5;154m
|
|
20:\033[38;5;118m
|
|
10:\033[38;5;121m
|
|
5:\033[38;5;123m
|
|
"
|
|
|
|
function pad () {
|
|
|
|
LEN=$1
|
|
shift
|
|
|
|
OUT="$@"
|
|
OUTLEN=$(echo -n "$OUT" | wc -c)
|
|
while [ $OUTLEN -lt $LEN ]; do
|
|
OUT=" $OUT"
|
|
OUTLEN=$(( OUTLEN + 1 ))
|
|
done
|
|
|
|
echo -n "$OUT"
|
|
|
|
}
|
|
|
|
function pct () {
|
|
A=$(( $(( 1000 * $1 )) / $2 ))
|
|
B=$(( $A / 10 ))
|
|
C=$(( $A - $(( 10 * $B)) ))
|
|
|
|
for CC in $PCT_COLORS; do
|
|
THRESHOLD=$(echo $CC | sed -e 's/:.*//')
|
|
COLOR=$(echo $CC | sed -e 's/.*://')
|
|
if [ $B -ge $THRESHOLD ]; then
|
|
echo -n -e "$COLOR"
|
|
break
|
|
fi
|
|
done
|
|
|
|
pad 4 "$B.$C"
|
|
}
|
|
|
|
MAXDIVIDE=1073741824 # expressed as KB
|
|
DIVIDENAMES=( TB GB MB KB )
|
|
|
|
function humanizekb () {
|
|
AMT=$1
|
|
|
|
I=0
|
|
D=$MAXDIVIDE
|
|
while [ $AMT -lt $D ]; do
|
|
D=$(( D / 1024 ))
|
|
I=$(( I + 1 ))
|
|
done
|
|
echo -n "$(( AMT / D )) ${DIVIDENAMES[$I]}"
|
|
|
|
}
|
|
|
|
function getloc {
|
|
|
|
(
|
|
|
|
LOCATION=$1
|
|
INDENT=$2
|
|
|
|
SKIPCOUNT=0
|
|
|
|
pushd "$LOCATION" > /dev/null
|
|
|
|
while read ITEM; do
|
|
|
|
BYTES=$(du -skx "$ITEM" 2>/dev/null | awk '{print $1}')
|
|
test -z "$BYTES" && BYTES=0
|
|
|
|
WD_PCT=$(( $(( $(( 1000 * $BYTES )) / $BYTES_THISDIR )) / 10 ))
|
|
|
|
# only bother showing things that are >1% of wd
|
|
if [ $WD_PCT -ge 1 ]; then
|
|
|
|
ITEMTYPE=$(stat --format='%F' "$ITEM")
|
|
|
|
pad 7 $( humanizekb $BYTES )
|
|
echo -n " "
|
|
|
|
pct $BYTES $BYTES_THISDIR
|
|
echo -n "% wd"
|
|
echo -n -e "$COLOR_RESET"
|
|
echo -n ", "
|
|
pct $BYTES $BYTES_FS
|
|
echo -n "% fs"
|
|
echo -n -e "$COLOR_RESET, "
|
|
|
|
|
|
echo -n "$INDENT"
|
|
test -z "$INDENT" || echo -ne "${COLOR_DIRMARK}↳ ${COLOR_RESET}"
|
|
|
|
if [ "$ITEMTYPE" == "directory" ]; then
|
|
echo -ne "${COLOR_DIR}${ITEM}${COLOR_RESET}"
|
|
echo "/"
|
|
|
|
if [ $WD_PCT -ge 5 ]; then
|
|
getloc "$ITEM" "$INDENT "
|
|
fi
|
|
|
|
else
|
|
echo -n "$ITEM"
|
|
echo
|
|
fi
|
|
|
|
|
|
else
|
|
SKIPCOUNT=$(( SKIPCOUNT + 1 ))
|
|
fi
|
|
|
|
|
|
|
|
done < <( find . -maxdepth 1 -type d|grep -v ^\\.\$ |sort|sed 's/^\.\///'; ls -lrSh | grep ^- | sed -E -e 's/^([^ ]+ +){8}//' )
|
|
|
|
# pad 33 ""
|
|
# echo -e "${COLOR_QUIET}${INDENT}(${SKIPCOUNT} skipped)${COLOR_RESET}"
|
|
|
|
popd > /dev/null
|
|
|
|
)
|
|
|
|
}
|
|
|
|
BYTES_THISDIR=$(du -sk . 2>/dev/null | awk '{print $1}')
|
|
BYTES_FS=$(df -k . | tail -1 | awk '{print $2}')
|
|
|
|
|
|
getloc '.' ''
|
|
|