Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I'm copying lots of files that have changed from one server to another using rsync. I know I can use the -n option to do a dry run, so I can see what files have been changed. However is it possible to get rsync to print a diff of the file contents that's changed? I'd like to see what's happening before doing a copy? Something I can save to a file and the apply with diff(1) later?

share|improve this question
add comment

6 Answers

up vote 5 down vote accepted

There might be a better way, but this might work, albeit not that efficiently:

 rsync -vrn / dest:/ > ~/file_list

Then edit test to remove the stats, then:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Another Option:
You might also consider mounting the file system with something like sshfs/fuse, and then just using diff.

share|improve this answer
    
Note: I didn't test those commands ;-) –  Kyle Brandt Sep 4 '09 at 11:31
    
Good start, but there's loads of extra output from rsync, such as the statistics, and "sending incremental file list", etc –  Rory Sep 4 '09 at 11:43
    
You could use --out-format="%f" –  Kyle Brandt Sep 4 '09 at 11:49
    
If you use the out-format, drop the v, and grep -v 'skipping non-regular file' ... That should get it pretty clean –  Kyle Brandt Sep 4 '09 at 11:51
    
Just checking if by chance there is a new / better method to rsync --diff two years later... –  ring0 Jan 13 '13 at 12:30
add comment

rsync can't do this natively, but if there's a possibility of using unison you can produce diff style format from that.

share|improve this answer
add comment

It's not possible natively because rsync only cares about binary differences between files.

You might be able to script it, using rsync's output. But it would be hackish.

I do believe it's natively possible with Unison though.

share|improve this answer
1  
Is mine what you meant by hackish? :-) –  Kyle Brandt Sep 4 '09 at 11:32
    
Absolutely, Kyle :D –  Dan Carley Sep 4 '09 at 11:35
add comment

The rsync algorithm works by comparing binary chunks of the file. Such binary diff is not meant to be printable. There is a command called rdiff that uses the rsync algorithm to generate a binary diff, but I don't think it'd be useful for what you describe, it is commonly used to implement incremental backups.

share|improve this answer
add comment

Why not just use something like diff (for text files) or xdelta (for binary files) to generate the diffs? Why do you need to specifically get something out of rsync?

share|improve this answer
    
I don't need rsync, but it need to be remote –  Rory Sep 4 '09 at 11:38
    
Oh noes, ssh! –  womble Sep 4 '09 at 12:58
add comment

To expand on Kyle's answer, this automates the process. Note that it is totally untested, probably pretty fragile, and may delete your computer and kill your dog.

#!/bin/bash

REMOTE=${1?Missing Remote Path}
LOCAL=${2?Missing Local Path}

# Trim trailing slash since we'll be adding it as a separator later
REMOTE=${REMOTE%/}
LOCAL=${LOCAL%/}

#Break it down
RHOST=${REMOTE%:*}
RPATH=${REMOTE#*:}

while read FILE; do
    diff -u ${LOCAL}/${FILE} <(ssh $RHOST "cat ${RPATH}/${FILE}")
done < <(rsync -vrn $REMOTE/ $LOCAL/ | sed '1d;/^$/q')
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.