Created
December 8, 2012 03:10
-
-
Save cushingw/4238415 to your computer and use it in GitHub Desktop.
Script to diff files between two remote servers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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