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

use*_*251 277 sync backup delete rsync

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

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

  • 默认情况下,是否rsync添加到源文件夹的文件添加到目标文件夹并更改源文件夹中已更改的文件,但不删除从源文件夹中删除的文件?

  • 如果是这种情况,最好的方法是rsync什么?我希望目标文件夹能够完美地反映源文件夹,这意味着删除已从源文件夹中删除的所有文件。

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

小智 336

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

rsync -avh source/ dest/ --delete
Run Code Online (Sandbox Code Playgroud)

  • 确保源是一个目录。使用 `source/* dest/` 不起作用。 (34认同)
  • 完美运行!即使它正在工作,我还是建议在运行 `rsync` 之前始终使用 `-n, --dry-run` 选项,特别是在涉及这些选项时 (`--delete`)。它将避免任何可能的头痛:)。 (21认同)
  • 我发现带有 `--delete` 或 `--delete-after` 的事件由于一些错误而不会删除:“遇到 IO 错误——跳过文件删除”。要解决此问题,请添加 `--ignore-errors` 选项并分别调试错误 (7认同)
  • @TheBicentennialMan `-a` [暗示](https://jlk.fjfi.cvut.cz/arch/manpages/man/extra/rsync/rsync.1.en) `-r`。 (3认同)
  • @oemb1905 bud,你的情绪很好,但这是人类深挖你的标志`-avWeqr` 不正确的土地:- 同时使用`vq`,这是冗长的被安静而不是理智取消的。- `a` 是 `-rlptgoD` 的简写...因此你第二次使用 `r` 是多余的。- `e` 使用了两次也总结:你使用 `-avWeqr` == `-aW` 到我的阅读。 (2认同)

shg*_*Inc 58

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

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

rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)

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

更新

因为我发现这些delete选项仅适用于 TARGET,如果某些文件从源中rsync --delete删除,请将它们从 TARGET 中删除。以及delete选项 by afterand before,如其手册页中所述:

--delete-before         receiver deletes before transfer, not during
Run Code Online (Sandbox Code Playgroud)

意思是:

  1. rsync 从 TARGET 中删除从 SOURCE 中删除的文件。
  2. rsync 开始同步文件。
--delete-after          receiver deletes after transfer, not during
Run Code Online (Sandbox Code Playgroud)

意思是:

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

注意--delete-{before/after}工具就在 TARGET 中。


小智 7

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

  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
Run Code Online (Sandbox Code Playgroud)

  • 我认为 -W 使它不仅可以复制增量数据,还可以始终复制整个文件。 (2认同)

Lon*_*est 5

如果 rsync 同步过程中出现任何错误,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
Run Code Online (Sandbox Code Playgroud)

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

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

cod*_*ave 5

命令

$ rsync -avhn --delete local/ remote/
Run Code Online (Sandbox Code Playgroud)

注意始终将本地所做的更改同步回远程。这意味着它需要注意同步本地远程,以便

  1. 文件添加当地被添加到远程
  2. 文件删除本地从删除远程
  3. 文件加入远程被去除
  4. 远程删除的文件如果存在则从本地恢复,否则忽略

参数说明:

  • -a 存档模式
  • -v 增加冗长
  • -h 以人类可读的格式输出数字
  • -n试运行,在不做任何更改的情况下执行试运行。最初总是使用这个标志来防止数据丢失。当你高兴时,删除它。

让结果不言自明:

如您所见,文件remote/remote_only已被删除,文件local/local_only同步