我的脚本基本上是这样的:
cp -al $yesterdays_snapshot $todays_snapshot
rsync -vadlH --exclude-from excludes.rsyc $source $todays_snapshot
除了一个问题之外,这个方法很好:
如果昨天我没有排除,但今天我意识到应该排除 /directory/cache,rsync 会停止查看缓存,但 cp 会继续每天将其向前复制。一段时间后,这意味着快照将包含一年前的 /directory/cache 内容,这不是理想的行为。我们根本不希望快照中包含 /directory/cache。
如果 rsync 从最新快照中删除 /directory/cache 会更好。
或者,如果 cp 知道不要复制 excludes.rsync 中列出的任何文件,那就好了
我可以编写一个函数来手动删除 todays_snapshot 中排除的所有文件,但这需要一点黑客攻击,而且这种问题感觉已经有现成的答案了。
有什么建议么?
答案1
您尝试使用 cp 和 rsync 执行的操作是创建一组彼此硬链接的相同文件的备份。
这非常有用,这就是为什么 rsync 开发人员已经想到了这一点并直接在 rsync 中包含本机功能来实现这一点。
该功能由选项提供--link-dest
。
基本上,您的 rsync 命令将如下所示rsync -va sourcepath newsnapshotpath --link-dest previoussnapshot
。Rsync 会将任何相同的文件硬链接到上一个快照,并根据需要复制新文件。源上不再存在的文件将不会被链接/复制。
在我的回答中另一个问题是我展示了一系列命令您可能想看看这一切究竟是如何运作的。
顺便说一下,如果你想避免重复工作,你可能还需要仔细研究一下 dirvish。它是专门为利用该--link-dest
功能而设计的备份。