Skip to content

Instantly share code, notes, and snippets.

@cushingw
Created December 8, 2012 03:10
Show Gist options
  • Save cushingw/4238415 to your computer and use it in GitHub Desktop.
Save cushingw/4238415 to your computer and use it in GitHub Desktop.
Script to diff files between two remote servers
#!/bin/bash
function showHelp ()
{
echo "usage: $0 -d -f FILE_PATTERN HOST1:PATH1 HOST2:PATH2"
echo "-d: Show file diffs"
echo "-D DIFF_OPTIONS: provide custom options to file diffs"
echo "-f FILE_PATTERN: restrict comparison to files matching given glob"
exit 1;
}
FILEPAT="*"
DIFF=0
DIFFOPTS=""
while getopts "D:dhf:" opt; do
case $opt in
D)
DIFFOPTS=$OPTARG
;;
d)
DIFF=1
;;
f)
FILEPAT=$OPTARG
;;
h)
showHelp
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
# :)
# echo "Option -$OPTARG requires an argument." >&2
# exit 1
# ;;
esac
done
shift $(($OPTIND - 1))
OLD=$1
NEW=$2
OLDHOST=`echo $OLD | awk -F ':' '{print $1}'`
OLDPATH=`echo $OLD | awk -F ':' '{print $2}'`
NEWHOST=`echo $NEW | awk -F ':' '{print $1}'`
NEWPATH=`echo $NEW | awk -F ':' '{print $2}'`
if [ -z "$OLDHOST" ] || [ -z "$OLDPATH" ] || [ -z "$NEWHOST" ] || [ -z "$NEWPATH" ]; then
showHelp
fi
OLDCOMMAND="cd $OLDPATH; find -name \"$FILEPAT\" -type f -exec md5sum {} \; | awk '{print \$2,\$1}' |sort"
OLDFILELIST=`ssh $OLDHOST "$OLDCOMMAND"`
NEWCOMMAND="cd $NEWPATH; find -name \"$FILEPAT\" -type f -exec md5sum {} \; | awk '{print \$2,\$1}' |sort"
NEWFILELIST=`ssh $NEWHOST "$NEWCOMMAND"`
DIFFS=`diff -W 2048 --suppress-common-lines -y <(echo "$OLDFILELIST") <(echo "$NEWFILELIST")`
OIFS="${IFS}"
NIFS=$'\n'
IFS="${NIFS}"
for LINE in ${DIFFS}; do
IFS="${OIFS}"
COLS=( $LINE )
if [ "${COLS[0]}" = ">" ]; then
CHANGE="${COLS[0]}"
FILE="${COLS[1]}"
else
CHANGE="${COLS[2]}"
FILE="${COLS[0]}"
fi
case $CHANGE in
"|")
echo "$FILE differs"
if [ "$DIFF" -eq 1 ]; then
echo -e '-------------------------------------------'
diff $DIFFOPTS <(ssh $OLDHOST "cd $OLDPATH; cat $FILE") <(ssh $NEWHOST "cd $NEWPATH; cat $FI
LE")
fi
;;
"<")
echo "$FILE only exists on $OLDHOST"
;;
">")
echo "$FILE only exists on $NEWHOST"
;;
esac
IFS="${NIFS}"
echo -e '\n'
done
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment