同步文件的最佳方法-仅复制现有文件,并且仅复制比目标更新的文件


18

我正在Ubuntu 12.04上本地进行此同步。这些文件通常是小的文本文件(代码)。

我想从source目录复制(保留mtime戳)到,target但是我只想复制中的文件target 已存在并且于中的文件source

因此,我只复制中的较新文件source,但它们必须存在于其中target,否则将不会被复制。(source文件将比得多target。)

我实际上将复制source到多个target目录。我提到这一点是为了避免影响解决方案的选择。但是,target如果需要的话,我可以轻松地多次运行命令,每次都指定新命令。

Answers:


29

相信您可以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选项吗?我正在阅读手册页。似乎我可能需要这个:rsync --archive --update --existing --whole-file --itemize-changes a/ b。还是大多数选择都是不必要的?(我添加了整个文件,因为这些文件大多数都是小文本文件。)
Monica Cellio的MountainX 2014年

@MountainX-仅添加您需要的选项。我将从-a那是开关的超集开始-rlptgoD
slm

让我澄清一下。我对--update和感到困惑--existing。我两个都需要吗?我测试了您的解决方案,它似乎可以正常工作,但是我仍然感到更安全--update
Monica Cellio专用的MountainX

@MountainX-确保您可以添加它,我也将其放在A中。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.