Feature request: Store diffed files separately.

Matt McCutchen matt at mattmccutchen.net
Wed Apr 2 13:25:14 GMT 2008


On Tue, 2008-04-01 at 16:12 -0700, Ben Wilber wrote:
> I would like to be able to
> store diffed files in a separate directory on the receiver so it makes
> doing an incremental backup easy and efficient.  Let me explain:

For completeness, I'll point out that you can accomplish what you
originally wanted with --compare-dest, although I think the --link-dest
approach Brock mentioned is better.

> Day 1: take a full backup of a directory: rsync -r ./source/ ./dest/
> Day 2: Diff the contents of ./source/ and ./dest/ and store only the
> new/modified files in ./incremental_day1

rsync -r --compare-dest=../dest/ ./source/ ./incremental_day1/

> Day 3: Diff the contents of ./source/ and ./dest/ and store only the
> new/modified files in ./incremental_day2

I take you to mean that incremental_day2 contains files created/modified
since the original dest, not since incremental_day1.  The command is
similar:

rsync -r --compare-dest=../dest/ ./source/ ./incremental_day2/

If you wanted to create "chained" incremental backups, the command is:

rsync -r --compare-dest=../incremental_day1/ \
    --compare-dest=../dest/ ./source/ ./incremental_day2/

Unfortunately, the semantics of --compare-dest are not quite right: this
command will omit files that changed back to their original state on day
2, but those files are needed to restore day 2 correctly.

> This way to restore a backup of Day 2 just do: rsync -Pvr
> ./incremental_day2 ./dest/ # But make the updates to ./source/ instead
> so you can preserve existing backups.

The restore command would be:

rsync -Pvr ./incremental_day2/ ./dest/ ./source/

When you give multiple source arguments, files from earlier source
arguments take priority over corresponding files from later source
arguments.  Thus, the command will restore the incremental_day2 version
of a modified file, not the dest version.

Files that are present in dest but *deleted* in incremental_day2 will be
restored, which is wrong.  To avoid this, you could save a "find ."
listing of the source in each incremental backup and restore only the
files in this listing using --files-from.

Matt



More information about the rsync mailing list