我们使用 rsync 将文件系统内容从一台机器复制到另一台机器作为备份。我们首先使用 --delete 和 --delete-excluded 开关运行 MACHINE-X->MACHINE-Y rsync 进行直接备份我们还使用任一删除标志在 MACHINE-Y 目标和 MACHINE-Y 上的另一个文件夹之间运行内部 Rsync。如果有人无意中删除了 MACHINE-X 上的文件,这将保留一份非破坏性副本。但是,它还需要对已同步的内容进行完整复制。
理想情况下,我希望能够以这样的方式运行非破坏性 rsync,即目标仅接收已删除的文件,从而避免不必要的重复。有什么办法吗?
答案1
您可以使用它-i --dry-run
来获取两个文件夹之间的更改列表,然后仅保留已删除的文件。
但是,大多数人使用 进行备份时,rsync
首先执行rsync
,然后cp -al
将备份数据(例如current
)复制到不同的目录(例如archive
)。该-l
参数告诉不要复制数据,而只是创建硬链接。这样,您可以在和cp
下使用相同的数据,但每个文件仅占用一次磁盘空间(例如,没有您现在遇到的开销)。current
archive
稍后,只要您将rsync
服务器恢复到current
,rsync
就会更新 中所有已更改的文件并删除已删除的文件。archive
但是 中的文件将不受影响。
当然,您可以archive
根据需要创建任意数量的文件夹。另请注意,rsync
提供了--link-dest
选项,可以archive
在rsync
运行过程中自动创建文件夹,而无需运行cp -al
。有关更多信息,请参阅手册页。
答案2
你可以做得更简单:
find dir1 | ssh host2 " \
cat > tmpfile1 ; \
find dir2 > tmpfile2 ; \
join -a1 tmpfile1 tmpfile2 | \
xargs rm -rf ; \
rm tmpfile1 tmpfile2"
至少这是没有 rsync 的普通 shell......