我想知道是否有办法告诉 rsync 仅在文件列表中的所有文件都成功传输时才应用更改(删除、覆盖、创建)。
需要澄清的是,这实质上是围绕转移进行交易。
答案1
您可以使用具有快照功能的文件系统(btrfs,zfs):
- 快照当前状态
- 同步
- 检查 rsync 的退出代码并根据需要回滚
您还可以注册自己的快照:
- 复制文件(这将成为工作区)
- rsync 到工作区
- 检查 rsync 的退出代码,如果退出代码正确,则将工作区移到原始文件上。
答案2
你可以使用这个--delay-updates
选项,或者如果你想真的原子更新,atomic-rsync
脚本(包含在 Debian 中/usr/share/doc/rsync/scripts/atomic-rsync.gz
)。
答案3
从 'rsync' 手册页中,你可能很幸运仅有的对于删除:
某些选项需要 rsync 知道完整的文件列表,因此这些选项会禁用增量递归模式。这些选项包括:--delete-before、--delete-after、--prune-empty-dirs 和 --delay-updates。因此,当连接两端的版本至少为 3.0.0 时,指定 --delete 时的默认删除模式现在是 --delete-during(使用 --del 或 --delete-during 明确请求此改进的删除模式)。另请参阅 --delete-delay 选项,它是比使用 --delete-after 更好的选择。