问题描述
我最近用Ubuntu服务器设置了一台机器来托管游戏服务器。我为每台游戏服务器安装了一个备份插件,用于在机器上的特定文件夹中频繁备份游戏世界文件。我还建立了一个cron
任务,每天晚上使用rsync和-a
选项自动将这些备份复制到我的Dropbox文件夹中。
几个月后,我的Dropbox帐户达到了它的存储限制,并且我意识到我无法保留这么多的备份,所以我配置了游戏服务器备份插件而不保留这么多的备份,然后等了几天,看看它是否会按照计划每周执行的方式删除较早的备份。备份插件最终完成了它的工作并删除了较早的备份,所以我预计rsync
cron任务会随后从我的Dropbox文件夹中删除较旧的备份以匹配源文件夹,但尚未这样做。所以我有几个问题:
-
默认情况下,
rsync
是否只将文件添加到已添加到源文件夹的目标文件夹,并更改源文件夹中已更改的文件,但不删除已从源文件夹中删除的文件? -
如果是这样的话,做
rsync
的最好方法是什么?我想要目标文件夹完全反映源文件夹,这意味着删除已从源文件夹中删除的任何文件。
我看到rsync
的手册页中列出了一些可能有用的技巧,但由于我不熟悉。
最佳解决办法
要删除目标中的文件,请将--delete
选项添加到您的命令中。例如:
rsync -avh source/ dest/ --delete
次佳解决办法
在该命令中使用某些选项delete
时,rsync命令不会删除任何文件。因此,如果源文件或文件夹中添加了任何文件或文件夹,它将同步到目标而不删除。
我建议您使用rsync
从源文件进行备份,并使用find ... rm
删除一段时间或文件大小的文件:
rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
上述代码块,从源进行备份,然后删除上次修改时间超过2个月的每个文件。
UPDATE
正如我发现delete
选项仅用于TARGET,如果某些文件从源代码中删除,rsync --delete
将它们从TARGET中删除。以及after
和before
的delete
选项,如其手册页中所述:
--delete-before receiver deletes before transfer, not during
意思是:
-
rsync从TARGET中删除从SOURCE中删除的文件。
-
rsync开始同步文件。
--delete-after receiver deletes after transfer, not during
意思是:
-
rsync开始同步文件。
-
同步后,rsync从TARGET中删除从SOURCE中删除的文件。
注意:--delete-{before/after}
只在TARGET中实现。
第三种解决办法
该命令将复制增量数据并与远程服务器保持同步。
-
它只会复制增量数据。
-
如果有任何数据从源删除,它将被删除。
-
如果在目的地删除任何数据,它将从源再次复制。
-
基本上这个命令会保持两个环境同步。
rsync -avWe ssh --delete-before (source) root@localhost:(destination)
rsync -avW --delete-before -e ssh (source) root@localhost:(destination)
例:
rsync -avWe ssh --delete-before /data root@192.168.254.254:/backup
rsync -avW --delete-before -e ssh /data root@192.168.254.254:/backup