Descripción: Compara dos ficheros comprimidos de manera recursiva. También investiga ficheros comprimidos dentro de los originales
- Soporta compresión zip, gzip y bz2
- Detecta si el fichero está empaquetado y comprimido solo probado con (tar.gz, tar.bz2)
Para saber mas sobre Diff click aqui
#!/bin/bash
#################################################
# Advanced diff v0.12 - 24/10/2007
# It compares archives (zip, jar, tar.gz, tar.bz2) recursively
# so when a compressed file is found, it is uncompressed
# and files inside compared as well
# Diff output is: diff_[file1]_vs_[file2]_[timestamp].txt
#################################################
TEMP="$HOME/borrar"
BIN_FILES="$TEMP/bin_files"
num_loop=0
MAX_LOOPS=5
# Checks if file exists (-1 if not) and if its format is supported (0 if it does, -2 if not)
function check_file {
if [ ! -f "$1" ]; then
echo "Not able to found file "$1", please check."
return -1
else
format=`file $1 | awk '{ print $2 }' | tr "[:upper:]" "[:lower:]"`
if [ $format != "zip" ] && [ $format != "bzip2" ] && [ $format != "gzip" ]; then
echo "No valid file format encountered (`basename $1`): $format"
return -2
fi
fi
}
# Extracts content from compressed file ($1) to temporary location ($2)
function extract {
if [ ! -d $2 ]; then
mkdir -p $2
# Added support for other compression types: bz2, tar.gz
# No support for more than 1 tar package inside compressed file
format=`file $1 | awk '{ print $2 }' | tr "[:upper:]" "[:lower:]"`
case $format in
"zip")
unzip -q $1 -d $2
;;
"bzip2")
# Modified for non GNU tar compatibility
# tar -xjf $1 -C $2
bzip2 -d -c $1 | (cd $2;tar xf - )
;;
"gzip")
# Modified for non GNU tar compatibility
# tar -xzf $1 -C $2
gzip -d -c $1 | (cd $2;tar xf - )
esac
fi
}
# Returns 1 if there are more files to compare, 0 otherwise
# ToDo: optimize
function loop {
echo -n "Uncompressing content... "
if [ $num_loop -lt 1 ]; then
EXT_DIR1=`echo "$TEMP/$1" | sed s/\[\.\]/_/g`
EXT_DIR2=`echo "$TEMP/$2" | sed s/\[\.\]/_/g`
else
EXT_DIR1=`echo "$1" | sed s/\[\.\]/_/g`
EXT_DIR2=`echo "$2" | sed s/\[\.\]/_/g`
fi
extract $1 $EXT_DIR1
extract $2 $EXT_DIR2
echo "OK"
FILE1=`basename "$1"`
FILE2=`basename "$2"`
OUTPUT=diff_"$FILE1"_vs_"$FILE2"_`date +%H%M%S_%d%m%y`.txt
diff -br -U0 $EXT_DIR1 $EXT_DIR2 > $OUTPUT
if [ ! -s $OUTPUT ]; then
echo "No differences found"
return 0
else
# Search diff's output for binary files that need to be analyzed
grep -i binary $OUTPUT | awk '{ if(NF eq 6)print($3" "$5);}' > $BIN_FILES
if [ -s $BIN_FILES ]; then
echo "Found `wc -w $BIN_FILES | awk '{ print $1 }'` more binary files to compare"
return 1
else
return 0
fi
fi
}
function remove_temp {
echo -n "Removing temporal files... "
rm -f $BIN_FILES
if [ -d $TEMP ]; then
rm -rf $TEMP
fi
echo "OK"
}
###############################
# Here start the main program #
###############################
if [ $# -lt 2 ]; then
echo "Usage: `basename $0` file1 file2"
exit -1
fi
check_file $1
if [ $? -eq 255 ]; then
echo "Exiting"
exit -1
fi
check_file $2
if [ $? -eq 255 ]; then
echo "Exiting"
exit -1
fi
if [ $1 == $2 ]; then
echo "Files are the same, no need to diff them"
exit 0
fi
# Here starts the original comparison
loop $1 $2
# Goes for more files (see supported formats) if founded inside given ones
if [ $? -gt 0 ]; then
while read line; do
# $num_loop controls depth level, not number of files encountered at one level
let num_loop+=1
if [ $num_loop -gt $MAX_LOOPS ]; then
echo "[INFO] $MAX_LOOPS loops reached. Maybe you enter into an infinite loop, increase MAX_LOOPS variable otherwise. Exiting"
exit -1
fi
TEMP1=`echo "$line" | cut -d " " -f1`
TEMP2=`echo "$line" | cut -d " " -f2`
#ToDo: formatting - field start counting (same number of tabs as number of loops) from last loop baseline, not from the end!
echo " `echo "$TEMP1" | awk -F/ '{ print $(NF-num)"/"$NF}' num=$num_loop` <=> `echo "$TEMP2" | awk -F/ '{ print $(NF-num)"/"$NF}' num=$num_loop`"
check_file $TEMP1
if [ $? -eq 0 ]; then
loop $TEMP1 $TEMP2
else
# False positive (not able to process)
let num_loop-=1
fi
done < $BIN_FILES
fi
# Removing useless paths from output file if it's not empty
if [ -s $OUTPUT ]; then
sed "s|$TEMP/||g" $OUTPUT > tmp
mv tmp $OUTPUT
else
rm -f $OUTPUT
fi
remove_temp
exit 0
0 comentarios:
Publicar un comentario