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


194

我最近在Ubuntu服务器上安装了一台计算机来托管游戏服务器。我为每个游戏服务器安装了一个备份插件,该插件可在计算机上的特定文件夹中创建游戏世界文件的频繁备份。我还建立了一个cron任务,每天晚上使用带有该-a选项的rsync将这些备份自动复制到我的Dropbox文件夹中。

几个月后,我的Dropbox帐户达到了存储限制,我意识到我将无法保留这么多的备份,因此我将游戏服务器备份插件配置为不保留那么多的备份,然后等待了几天,看是否可以按计划每周删除一次旧备份。备份插件最终完成了工作并删除了较旧的备份,因此我期望rsynccron任务随后能够从我的Dropbox文件夹中删除较旧的备份以匹配源文件夹,但尚未这样做。所以我有几个问题:

  • 默认情况下,它rsync只能增加已添加到源文件夹的文件到目标文件夹和更改已在源文件夹被修改的文件,但不能删除这是从源文件夹中删除的文件?

  • 如果是这样,那么rsync做到这一点的最佳方法是什么?我希望目标文件夹完美地反映源文件夹,这意味着删除已从源文件夹删除的所有文件。

我看到了手册页中列出的一些选项rsync可能可以解决问题,但是由于我不熟悉。

Answers:


227

要删除目标中的文件,请将--delete选项添加到命令中。例如:

rsync -avh source/ dest/ --delete

15
确保源是目录。使用source/* dest/将不起作用。
汤姆·萨利巴

3
我发现带有的事件--delete--delete-after由于某些错误而不会删除该事件:“遇到IO错误-跳过文件删除”。若要解决此添加--ignore-errors选项并分别调试错误
MHT

12
完美的作品!即使它可以正常工作,我还是建议始终使用-n, --dry-runoption,然后再运行rsync,特别是在涉及这些(--delete)选项时。这将避免任何可能的头痛:)。
ivanleoncz

2
@MHT:没有您的评论,似乎没有答案是完整的。
朗尼·贝斯特

2
@TheBicentennialMan -a 暗示 -r
x-yuri

45

rsync的,而你使用它的一些选项命令不会删除任何文件,delete该命令。因此,如果源中添加了任何文件或文件夹,它将被同步到目标而不进行任何删除。

我建议您在一段时间或文件大小中用于rsync从源文件进行备份,并find ... rm用于删除文件:

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;

上面的代码块,从源进行备份,然后删除上次修改时间超过2个月的每个文件。

更新

我发现这些delete选项仅适用于TARGET,如果从源中rsync --delete删除了一些文件,则将它们从TARGET中删除。以及如其手册页所述的deleteby after和选项before

--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
谢谢回复!!您是指rsync的“删除”选项吗?为什么我不能仅对rsync使用“删除”选项?
user254251 2014年

@ user254251,如果使用delete,则rsync命令立即删除文件。但是在这种情况下,有更多的时间来处理任何错误。
shgnInc 2014年

如果我理解正确,那就是说我应该将删除任务与rsync任务分开,以避免出错。但我有个问题。rsync的手册页列出了一些选项,这些选项似乎可以通过在复制任务之前或之后运行删除任务来分离删除任务。例如,我看到了两个选项--delete-before和--delete-after。使用这些选项的rsync是否会与您描述的方法具有相同的效果?我在手册页上阅读了每个选项的完整说明,但是说明中有一些我不理解的信息。
user254251 2014年

@ user254251,答案已更新。我不知道是否有一种方法可以通过rsync中的时间限制从TARGET中删除文件。
shgnInc 2014年

谢谢!因此,如果仅使用--delete-before选项,您认为我可以避免错误吗?我没有指定超时时间,因此我不必担心rsync删除阶段是否会延迟传输阶段。rsync每天运行一次,这在下一次同步之前有足够的时间来同步备份文件,因此我也不需要对同步进行时间限制。
user254251 2014年

6

此命令将复制增量数据并使其与远程服务器同步。

  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

2
我认为-W使其不只复制增量数据,而总是复制整个文件。
图兰斯·科尔多瓦

我通过执行以下命令得到此错误: rsync: Failed to exec --delete-before: No such file or directory (2)
Jeff Tian

1

如果rsync的scync过程中有任何错误,rsync的将无法正常删除它应有的文件,即使你使用--delete--delete-after--delete-before

这就是为什么解决rsync错误很重要的原因。

我的大多数错误是由于--perms与非Linux文件系统同步时使用了该选项所致。当我换成--perms--no-perms,这些错误走了,然后删除工作。

--perms从Linux文件系统同步到另一个Linux文件系统时可以,但是,如果从Linux同步到非Linux文件系统(如NTFS,FAT),--perms则会导致错误,因为rsync无法在操作系统上设置Linux权限。非Linux文件系统。同样,错误=不删除。

-当同步到非Linux分区,我使用--no-perms,以避免这些错误破坏--delete--delete-after--delete-before

如果此后仍然出现错误,并且无法弄清楚如何使这些错误消失,则可以运行专门用于删除不同步文件的命令:

sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination

上面的命令将删除不同步的内容,但不会同步任何文件。因此,此后您应该再次同步。该命令基于此答案,除了我还添加了--ignore-errors参数之外,因此即使有错误,它也会删除。


1
谢谢你的提示!我是5年前这个问题的原始作者。我真的很高兴您发布了此信息,因为我一直打算在不久的将来设置与NTFS驱动器的同步,并且由于我计划使用“ -a”选项,我可能会遇到权限错误。 rsync,它同步权限(以及其他功能)。因此,我在笔记中添加了“ --no-perms”。我现在计划使用rsync -a --no-perms --delete-before。我有一个问题:不能--delete-before通过在同步之前运行删除操作来避免文件删除问题?认为那是它的目的。
user254251

@ user254251-我不确定。我想这取决于它真正“提前删除”的时间。如果在删除开始之前遇到一些错误,那您就搞砸了。我的建议是,除非可以,否则请尽量避免使用NTFS,除非您很痛苦。NTFS到NTFS可以正常工作。用于Linix的NTFS可以正常工作。避免将“ Linux文件系统”改为“非Linux文件系统”;确保正确删除是一件很痛苦的事情。您可以完成此操作,但我认为仅将目标驱动器格式化为EXT4并不麻烦。
Lonnie Best
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.