如何使用 rsync 仅覆盖较小的文件

如何使用 rsync 仅覆盖较小的文件

我尝试使用rsync递归复制目录,如下所示:

rsync -a /src/* /dst
  • /src包含sample.png (0.5MB)

  • /dst包含sample.png (1MB)

它们都有相同的时间戳。现在,当我运行rsync命令时,with 1MB 当然sample.png会被 with 0.5MB 覆盖,sample.png这是我想避免的。

有没有办法告诉rsync它应该只复制较大的文件?

答案1

rsync本身不支持这种传输条件,但有一个选项有效地有你想要的行为,虽然这效率不高并且在某种程度上扩展了该选项的预期用途,因此,在生产使用之前请谨慎使用并验证非关键测试用例

该选项称为--append-verify.

为了解释一下,我引用了rsync联机帮助页,首先是该--append选项:

--append

这会导致 rsync 通过将数据附加到文件末尾来更新文件,这假定接收端已存在的数据与发送端文件的开头相同。 如果需要传输文件,并且接收方的文件大小与发送方的大小相同或更长,则跳过该文件

换句话说,该--append选项假设,顾名思义,源上的文件仅通过添加到末尾来更改,并跳过源上比目标上小的文件,因此您不会覆盖源上的文件文件较小的目的地。

因为我不完全确定该选项的内部工作原理,并且因为这意味着只有文件的“附加”部分(即只有目标上存在最后一个字节之后的部分,无论前面的部分是否是)真的一样)实际上是转移的,我建议

  • use --append-verify,正如手册页所述,它在传输后验证过程中包含整个文件内容,如果文件的第一部分存在差异(选项先验将被视为相同)。根据我的理解,这应该确保即使在最初仅实际传输“附加”部分的情况下,验证也会考虑全部内容的文件,请注意,如果您的文件实际上仅“通过附加增长”,则本来相同的部分也会有所不同,并重新发送整个文件,从而创建它的正确副本。这当然意味着不必要的数据传输,也是我警告这种效率低下的原因。

  • 仅在您需要的文件上使用此特定选项,在您的示例中sample.png,彻底检查它真的执行预期操作,并使用“常规”rsync选项复制所有其他文件。

相关内容