当前位置: 首页>>技术问答>>正文


如何让rsync删除已从源文件夹中删除的文件?

, , , ,

问题描述

我最近用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中删除。以及afterbeforedelete选项,如其手册页中所述:

--delete-before         receiver deletes before transfer, not during

意思是:

  1. rsync从TARGET中删除从SOURCE中删除的文件。

  2. rsync开始同步文件。

--delete-after receiver deletes after transfer, not during

意思是:

  1. rsync开始同步文件。

  2. 同步后,rsync从TARGET中删除从SOURCE中删除的文件。

注意:--delete-{before/after}只在TARGET中实现。

第三种解决办法

该命令将复制增量数据并与远程服务器保持同步。

  1. 它只会复制增量数据。

  2. 如果有任何数据从源删除,它将被删除。

  3. 如果在目的地删除任何数据,它将从源再次复制。

  4. 基本上这个命令会保持两个环境同步。

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/549.html,未经允许,请勿转载。