The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

rsync-new2old - Rsync wrapper to make sure we sync new data to old, not otherwise

VERSION

This document describes version 0.008 of rsync-new2old (from Perl distribution App-rsync-new2old), released on 2019-03-28.

SYNOPSIS

Use like you would use rsync:

 % rsync-new2old -avz [other options...] <source> <target>

DESCRIPTION

Rsync is a fast and versatile directory mirroring tool. I often use it to synchronize my large media/software directory from one computer to another. However, sometimes I add/delete stuffs from this directory on one computer (say B) instead of on another (A). Then I forget and synchronize the media directory from A to B instead of B to A. The changes in B are then lost.

This tool, rsync-new2old, is a simple rsync wrapper that will first check that the newest modification filestamp (mtime) of file/subdirectory in source directory is not older than the newest mtime of file/subdirectory in target directory. If that check passes, it runs rsync. If not, it aborts.

Illustration:

 source/
   dir1/          -> mtime: 2016-12-15T00:00:00
     file1        -> mtime: 2016-12-15T00:00:00
     file2        -> mtime: 2016-12-16T01:00:00

 target/          -> mtime: 2016-12-05T00:00:00
   dir1/          -> mtime: 2016-12-06T00:00:00
     file2        -> mtime: 2016-12-06T00:00:00

The newest mtime in source is 2016-12-16T01:00:00 (the mtime of file2), while the newest mtime of target is 2016-12-06T00:00:00 (the mtime of file2 or dir1). rsync-new2old will allow synchronizing from source to target.

Caveats: Note that source and target must be local filesystem paths, so this wrapper cannot be used if one of source/target is a remote path. Also, this script currently doesn't regard rsync --exclude options. Please consider the alternatives mentioned in the See Also section.

OPTIONS

--help, -h, -?

--version

--create-target-if-not-exists

ENVIRONMENT

RSYNC_NEW2OLD_RSYNC_CMD

String. Rsync command to use. Defaults to rsynccolor (if available on PATH) or rsync. Can be used to chain several rsync wrappers together.

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/App-rsync-new2old.

SOURCE

Source repository is at https://github.com/perlancar/perl-App-rsync-new2old.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-rsync-new2old

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

SEE ALSO

rsync, rsynccolor.

Other one-way mirroring tools:

  • ZFS send and receive, https://docs.oracle.com/cd/E18752_01/html/819-5461/gbchx.html

    Filesystems like ZFS also record changes to filesystems and can propagate them to another filesystem efficiently. If you are synchronizing between two ZFS filesystems (even across network), this approach offers great performance (e.g. detect renames and can propagate this change quickly instead of rsync which must delete files with old names + re-copy the same files with new names) and 2-way mirroring capability.

A safer solution when you want to synchronize two directories while maintaining changes from both directories is to use 2-way mirroring solutions. Below are some:

  • unison, https://www.cis.upenn.edu/~bcpierce/unison

    A two-way mirroring tool which also uses the rsync algorithm to transfer data. It works by first recording the state of a directory (all the mtimes, permissions, etc of its files). Then, when you want to synchronize this directory, it will calculate the changes between the current state and the previous, then negotiate it with the changes in the target directory. It can propagate files added/deleted from either directory, and can detect files that are changed in both directory (a conflict). It does not merge conflicts.

    I found rsync faster when transferring large directories, so I usually just use rsync.

  • Version control tools, like git, mercurial, etc

    These tools can propagate changes from either direction including merging conflicts (changes to the same file). Many however are not designed to store large binaries so using these tools to synchronize large binaries can result in inefficient disk storage or slow performance.

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2019, 2018, 2017, 2016 by perlancar@cpan.org.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.