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

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

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

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

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

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

我看到手册页中列出的一些选项rsync可能会起到作用,但因为我不熟悉。

答案1

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

rsync -avh source/ dest/ --delete

注意:-avh适用于--archive --verbose --human-readable

答案2

同步当您在命令中使用某些选项时,命令不会删除任何文件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 中删除。 以及和delete选项,如其手册页中所述:afterbefore

--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中实现。

答案3

命令

$ rsync -avhn --delete local/ remote/

始终将本地所做的更改同步回远程。这意味着它始终将本地所做的更改同步回远程当地的偏僻的使得

  1. 文件添加当地的被添加到偏僻的
  2. 文件已删除当地的被移除偏僻的
  3. 文件添加偏僻的被删除
  4. 文件已删除偏僻的从恢复当地的如果存在,则忽略

参数解释:

  • -a存档模式
  • -v增加详细程度
  • -h以人类可读的格式输出数字
  • -n干运行,进行不做任何改变的试运行。始终首先使用此标志以防止数据丢失。当你高兴的时候,就把它取下来。

让结果说明一切:

  • 创建2个目录

    $ mkdir local/ remote/
    
  • 在其中创建文件

    $ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
    
  • 查看已创建的内容(rsync 之前):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  remote_only
    
  • 调用 rsync:

    $ rsync -avh --delete local/ remote/
    sending incremental file list
    deleting remote_only
    local_only
    
    sent 160 bytes  received 50 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
    
  • 查看结果 (rsync 之后):

    $ ls local/ remote/ 
    
    local/:
    exists_locally_and_remotely  local_only
    
    remote/:
    exists_locally_and_remotely  local_only
    

如您所见,文件远程/remote_only删除, 文件本地/local_only同步

答案4

如果 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还添加了参数,所以即使有错误它也会被删除。

相关内容