我尝试使用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
选项复制所有其他文件。