use*_*251 277 sync backup delete rsync
我最近设置了一台带有 Ubuntu Server 的机器来托管游戏服务器。我为每个游戏服务器安装了一个备份插件,它会在机器上的特定文件夹中频繁备份游戏世界文件。我还建立了一个cron
任务,每天晚上使用带有-a
选项的rsync 自动将这些备份复制到我的 Dropbox 文件夹。
几个月后,我的 Dropbox 帐户达到了存储限制,我意识到我无法保留这么多备份,因此我将游戏服务器备份插件配置为不保留这么多备份,然后等了几天看看是否可以删除旧备份,因为它计划每周执行一次。备份插件最终完成了它的工作并删除了旧备份,所以我期待rsync
cron 任务随后从我的 Dropbox 文件夹中删除旧备份以匹配源文件夹,但它没有这样做。所以我有几个问题:
默认情况下,是否rsync
只将添加到源文件夹的文件添加到目标文件夹并更改源文件夹中已更改的文件,但不删除从源文件夹中删除的文件?
如果是这种情况,最好的方法是rsync
什么?我希望目标文件夹能够完美地反映源文件夹,这意味着删除已从源文件夹中删除的所有文件。
我看到手册页中列出的一些选项rsync
可能可以解决问题,但因为我不熟悉。
小智 336
要删除目标中的文件,请将该--delete
选项添加到您的命令中。例如:
rsync -avh source/ dest/ --delete
Run Code Online (Sandbox Code Playgroud)
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 after
and before
,如其手册页中所述:
--delete-before receiver deletes before transfer, not during
Run Code Online (Sandbox Code Playgroud)
意思是:
--delete-after receiver deletes after transfer, not during
Run Code Online (Sandbox Code Playgroud)
意思是:
注意:--delete-{before/after}
工具就在 TARGET 中。
小智 7
此命令将复制增量数据并使其与远程服务器保持同步。
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)
如果 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
还添加了参数,因此即使存在错误它也会删除。
命令
$ rsync -avhn --delete local/ remote/
Run Code Online (Sandbox Code Playgroud)
注意始终将本地所做的更改同步回远程。这意味着它需要注意同步本地和远程,以便
参数说明:
-a
存档模式-v
增加冗长-h
以人类可读的格式输出数字-n
试运行,在不做任何更改的情况下执行试运行。最初总是使用这个标志来防止数据丢失。当你高兴时,删除它。让结果不言自明:
创建2个目录
$ mkdir local/ remote/
Run Code Online (Sandbox Code Playgroud)
在其中创建文件
$ touch local/local_only remote/remote_only local/exists_locally_and_remotely remote/exists_locally_and_remotely`
Run Code Online (Sandbox Code Playgroud)
查看已创建的内容(在 rsync 之前):
$ ls local/ remote/
local/:
exists_locally_and_remotely local_only
remote/:
exists_locally_and_remotely remote_only
Run Code Online (Sandbox Code Playgroud)
调用 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
Run Code Online (Sandbox Code Playgroud)
查看结果(在 rsync 之后):
$ ls local/ remote/
local/:
exists_locally_and_remotely local_only
remote/:
exists_locally_and_remotely local_only
Run Code Online (Sandbox Code Playgroud)
如您所见,文件remote/remote_only已被删除,文件local/local_only已同步。