我最近安装了一台装有 Ubuntu Server 的机器来托管游戏服务器。我为每个游戏服务器安装了一个备份插件,该插件会在机器上的特定文件夹中频繁创建游戏世界文件的备份。我还建立了一个cron
任务,使用带有选项的 rsync 每晚自动将这些备份复制到我的 Dropbox 文件夹中-a
。
几个月后,我的 Dropbox 帐户达到了存储限制,我意识到我无法保留这么多备份,因此我将游戏服务器备份插件配置为不保留这么多备份,然后等待几天,看看它是否会按计划每周删除较旧的备份。备份插件最终完成了它的工作并删除了较旧的备份,因此我期望rsync
cron 任务随后从我的 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
选项,如其手册页中所述:after
before
--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中实现。
答案3
命令
$ rsync -avhn --delete local/ remote/
始终将本地所做的更改同步回远程。这意味着它始终将本地所做的更改同步回远程当地的和偏僻的使得
- 文件添加在当地的被添加到偏僻的
- 文件已删除从当地的被移除偏僻的
- 文件添加在偏僻的被删除
- 文件已删除从偏僻的从恢复当地的如果存在,则忽略
参数解释:
-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
还添加了参数,所以即使有错误它也会被删除。