#!/bin/bash
if [ "$1" = "-q" ]; then
quota=$2
shift
shift
else
quota=10000
fi
nfiles=3 # number of files we show
ndirs=3 # ditto for directories
tmpfile=/tmp/.diskuse.$USER # name of temp file used
program_name=diskuse # name of this program
MAILDIRS="mail mbox" # list of directories where mail is stored
MAILFILES="mail.txt" # list of files where mail is likely to be stored
maxMailSize=`perl -e "print $quota*0.4"` # warn if the user has more mail than this
largeMailFolders="" # list of oversize mail folders
helpfile="/home/elflord/bin/help.txt" # help file for program
# Interactive prompt if user wants to delete a file
# I moved it here because it was getting loooonnnngggg...
function deleteFile {
local input_valid=0
while [ $input_valid -eq 0 ]
do
echo "choose a file to delete, enter a number corresponding "
echo " to the list of files above: 1 .. $nfiles"
read Y
if [ -n "$Y" -a $( expr "$Y" : "[0-9]*" ) -ne 0 ]; then
Filename="filename$Y"
if [ -n "$(eval echo \$$Filename)" ]; then
input_valid=1
echo "confirm action: delete $(eval echo \$$Filename) ? (y/n)"
read CONFIRM
case "${CONFIRM}" in (y|Y|yes|YES)
echo
echo "$(eval echo \$$Filename) deleted"
echo
echo "press \"return\" to continue"
read
return 0;;
(*)
echo "$(eval echo \$$Filename) not deleted"
echo
echo "press \"return\" to continue"
read
return 1;;
esac
fi
fi
if [ $input_valid -eq 0 ]; then
echo -n "that's not a sensible value. Try again. a number,"
echo "1 .. $nfiles please"
fi
done
}
# Function to get (and print ) the largest $ndirs directories. Currently not used.
function getDirSizes() {
ls -l ${dir}|grep ^d>/dev/null||return 1
echo "your largest ${ndirs} directories and size (in Kilobytes) are:"
echo
{ for X in ${dir}/* ${dir}/.[^.]*
do
if [ -d "$X" ]; then
du --summarize $X
fi
done
}|sort -n|tail --lines ${ndirs}|
sed -e "s/$(echo $dir/|sed -e 's/\//\\\//g' )//"
}
# Function to get (and print) the largest $nfiles files
function mailDiagnostics() {
for x in $MAILDIRS; do
Size=${x}size
if [ -d ${dir}/$x ]; then
declare $Size=$(du --summarize ${dir}/$x|awk '{print $1}')
echo "your total disk usage for your email directory, $x is: $(eval echo \$$Size)K"
else
declare $Size="0"
fi
if [ "$(eval echo \$$Size)" -ge "$maxMailSize" ];then
echo "your $x directory is very large, try deleting some messages "
echo "from your email folders. "
fi
done
if [ -n "largeMailFolders" ]; then
echo "Consider quitting and using your email program"
echo "to delete some mail from the following folders "
echo
echo "$largeMailFolders $largeMailFiles"|sed -e 's/[^ ]*\///g'
fi
}
function mainDiagnostics(){
if [ -d ${dir}/public_html ]; then
webpageSize=$(du --summarize ${dir}/public_html|awk '{print $1}')
echo "your disk usage for your webpage (public_html) is: $webpageSize K"
fi
total_diskuse=$(du --summarize ${dir}|awk '{print $1}')
echo "Your total disk usage for your home directory is: ${total_diskuse}K"
if [ "$total_diskuse" -ge $quota ]; then
echo "you are over quota "
fi
}
if [ -z "$1" ] ; then
dir=$HOME
else
dir=$1
fi
# main loop for interactive prompting
while true
do
largeMailFolders="" # list of oversize mail folders under $MAILDIRS
largeMailFiles="" # list of oversize mailfiles from $MAILFILES
# getDirSizes
echo
echo "your largest ${nfiles} files and their size (in Kilobytes) are : "
echo
find "$dir" -type f -regex ".*" -printf "%k %p\n" |
sort -n |
# this (computationally expensive) line sort of
# eliminates mailfiles from the list.
# egrep -v "$(echo "$MAILDIRS"|sed -e 's/ /|/g' -e 's/[0-9] */^/')|$(echo "$MAILFILES"|sed -e 's/ /|/g')"|
tail --lines=${nfiles} |
# cat -n |
sed -e "s/$(echo $dir/|sed -e 's/\//\\\//g' )//" |
sed -e 's/^[\t ]*//' > $tmpfile
X=1
while [ $X -le $nfiles ]; do
declare filename=filename$X # "pointer" to filename1 , etc
declare filenumber=filenumber$X # ditto for filenumber
declare $filename="$( sed -e "${X}!d" -e 's/[0-9]* //' -e s/\"/\\\"/ $tmpfile )"
declare $filenumber="$( sed -e "${X}!d" -e 's/ .*//' $tmpfile )"
echo -n "($X) $(eval echo \$$filename) :"
echo -n "$(eval echo \$$filenumber)K"
for x in $MAILDIRS
do
if [ $(expr match "$(eval echo \$$filename)" "$(echo "$x/\|$x\$"|sed -e 's/\./\\\./g')" ) -ne 0 ]
then
echo " ( mail folder )"
if [ -n "$largeMailFolders" ]; then
largeMailFolders="${largeMailFolders} $(eval echo \$$filename)"
else
declare largeMailFolders="$(eval echo \$$filename)"
fi
fi
done
for x in $MAILFILES
do
if [ $(expr match "$(eval echo \$$filename)" "$(echo "$x/\|$x\$"|sed -e 's/\./\\\./g')" ) -ne 0 ]
then
echo " ( mail folder )"
if [ -n "$largeMailFiles" ]; then
largeMailFiles="${largeMailFiles} $(eval echo \$$filename)"
else
declare largeMailFiles="$(eval echo \$$filename)"
fi
fi
done
echo
X=$( expr $X + 1 )
done
echo
mailDiagnostics
echo
mainDiagnostics
echo
echo -n " q : quit "
echo -n " d : delete a file "
echo " h : help"
read X
case $X in (q|Q)
echo "goodbye, ${USER}. "
echo "Type $program_name if you want to return to this later"
exit 0;;
(d|D)
deleteFile;;
(h|H)
less -Q "$helpfile"
echo "press \"return\" to continue"
read
clear;;
esac
echo
done