相信您可以rsync
用来做到这一点。关键的观察结果是需要使用--existing
和--update
开关。
--existing skip creating new files on receiver
-u, --update skip files that are newer on the receiver
这样的命令可以做到:
$ rsync -avz --update --existing src/ dst
例
假设我们有以下示例数据。
$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2
如下所示:
$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3
src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan 1 2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3
现在,如果我要同步这些目录,将不会发生任何事情:
$ rsync -avz --update --existing src/ dst
sending incremental file list
sent 12 bytes received 31 bytes 406.00 bytes/sec
total size is 0 speedup is 0.00
如果我们提供touch
一个源文件,以便它是较新的:
$ touch src/file3
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3
再次运行rsync
命令:
$ rsync -avz --update --existing src/ dst
sending incremental file list
file3
sent 115 bytes received 31 bytes 292.00 bytes/sec
total size is 0 speedup is 0.00
我们可以看到file3
,因为它是较新的,并且它存在于中dst/
,所以它被发送了。
测试中
为了确保在松开该命令之前一切正常,建议您使用另一个rsync
开关--dry-run
。我们也添加另一个,-v
以便rsync
输出更加详细。
$ rsync -avvz --dry-run --update --existing src/ dst
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0 hash_hits=0 false_alarms=0 data=0
sent 88 bytes received 21 bytes 218.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
rsync --archive --update --existing --whole-file --itemize-changes a/ b
。还是大多数选择都是不必要的?(我添加了整个文件,因为这些文件大多数都是小文本文件。)