tl; dr:我想要rsync
一个目录到它自己的后代,然后rsync
将所述后代返回到原始目录——包括两个方向的删除和排除。
在你问一个明显的问题之前,“你为什么要这样做?” 或指出另一种方法会有多好,这是业务需求。这不是我的选择,我知道风险,所以放纵我。我不打算进一步证明这种方法的合理性。?
细节:
我想要rsync
一个目录到它自己的后代 - 即,它“下面”或“内部”的目录,例如,然后将后代的更改同步回原始目录,例如parent
to ,包括删除和两个方向的排除。在视觉上,我需要这样做:parent/child
parent/child
parent
parent -> parent/child
parent <- parent/child
困难在于...
- 从祖先到后代时防止无限递归
- 将后代同步回其祖先时,不会在操作中删除源文件(表现为“文件已消失”错误)
- 始终尊重例外情况
解决方案分为三个部分。为了...
child
从同步时parent/child
--delete-after
标志而不是--delete
exclude.txt
与/var/www/parent/exclude.txt
这是一个测试脚本(带有一些特殊格式以获得更好的输出):
输出:
另一种方法是设置绑定挂载,从而使两棵树看起来独立,然后正常 rsync:
现在,当你这样做时
空目录
/mnt/empty
将掩盖真实/path/to/parent/child
目录;/mnt/parent/child
将显示为空并避免无限递归。当你这样做
情况类似;
/mnt/child/child/
将是空的(因为您一开始没有复制任何内容),并且/mnt/parent/child/
也将显示为空,因此没有从那里删除任何内容的风险。这可能不如@TravisCarden 的解决方案优雅,但可能更健壮。