Listing 1: fss.sh--Compares two du_files
#!/bin/sh
# fss.sh:
# compares two du-files and reports with:
#
# '>' filesize increased
# '<' filesize decreased
# '=' filesize not changed
# '+' new file
# '-' file removed
#
PROG=`basename $0`
usage(){
echo $PROG: $* >&2
echo Usage: $PROG '-[<>=+-]' -o ofile -n nfile >&2
exit 1
}
# PARSE OPTIONS
# it was not very clever to use <> and - as flags.
# the user must take care of < and >, but we must take
# care of -: getopt doesn't like -, so we convert it to a D
NARG=
for arg in $* # - can be in any arg.
do
case "$arg" in
-*-*)
NARG="$NARG "`echo ' ' $arg |
sed -e 's/-/D/g' -e 's/D/-/'`
;;
*) NARG="$NARG $arg"
;;
esac
done # NARG is the new commandline
set -- `getopt '><=+Do:n:' $NARG`
EQ=N LT=N GT=N RM=N NW=N
DONE=0
OLD=
NEW=
for i in $*
do
case $i in
'->') GT=Y ; shift ;;
'-<') LT=Y ; shift ;;
'-=') EQ=Y ; shift ;;
'-D') RM=Y ; shift ;;
'-+') NW=Y ; shift ;;
'-o') OLD=$2; shift 2 ;;
'-n') NEW=$2; shift 2 ;;
'--') DONE=1; shift ;;
*) if test $DONE -eq 1
then
usage unexpected argument: $i
fi
;;
esac
done
if test ! -f "$OLD" -o ! -f "$NEW"
then
usage -o or -n: not a file or not set
fi
if test $EQ$LT$GT$NW$RM = NNNNN
then
EQ=Y LT=Y GT=Y RM=Y NW=Y
fi
# Parsing done, write both files to awk into 2 assoc arrays
# In awk's END section the comparison is done
( cat $OLD
echo ======
cat $NEW
) | awk '
BEGIN { f2=0 }
$0 == "======" { f2=1; next }
{ if (f2 == 0)
f1a[$2] = $1
else
f2a[$2] = $1
}
END {
for( f1f in f1a) {
du1 = f1a[f1f]
du2 = f2a[f1f]
if (du2 == "" && "'$RM'" == "Y")
# removed
printf "-\t%d\t%d\t%d\t%s\n" , du1, 0, 0, f1f
else if (du1 == du2 && "'$EQ'" == "Y")
# equal
printf "=\t%d\t%d\t%d\t%s\n" , du1, du2, 1, f1f
else if (du1 > du2 && "'$LT'" == "Y")
# shrunk
printf "<\t%d\t%d\t%d\t%s\n" , du1, du2, du1/du2,
f1f
else if (du1 < du2 && "'$GT'" == "Y")
# grown
printf ">\t%d\t%d\t%d\t%s\n" , du1, du2, du2/du1,
f1f
}
# new
for( f2f in f2a) {
du1 = f1a[f2f]
du2 = f2a[f2f]
if (du1 == "" && "'$NW'" == "Y")
printf "+\t%d\t%d\t%d\t%s\n" , 0, du2, du2, f2f
}
}'
|