我最近在Ubuntu服务器上安装了一台计算机来托管游戏服务器。我为每个游戏服务器安装了一个备份插件,该插件可以在计算机上的特定文件夹中创建游戏世界文件的频繁备份。我还建立了一个cron任务,每晚使用rsync和-a选项将这些备份自动复制到我的Dropbox文件夹中。由于能够保留这么多的备份,因此我将游戏服务器备份插件配置为不保留这么多的备份,然后等待了几天,以查看是否可以按计划每周删除旧备份。备份插件最终完成了工作,并删除了较旧的备份,因此我期望rsync cron任务随后能够从我的Dropbox文件夹中删除较旧的备份以匹配源文件夹,但尚未这样做。因此,我有两个问题:


默认情况下,rsync是否仅将文件添加到目标文件夹中
已添加到源文件夹并更改文件
/>已在源文件夹中进行了更改,但未删除从源文件夹中删除的文件?
如果是这种情况,使rsync这样做的最佳方法是什么?我
想要目标文件夹以完美地反映源文件夹,
,这意味着删除已从源文件夹删除的所有文件。

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

评论

另请参阅其他StackExchange的以下相关和重要考虑因素:unix.stackexchange.com/questions/18564/…、superuser.com/questions/156664/…

#1 楼

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

rsync -avh source/ dest/ --delete


评论


确保源是目录。使用source / * dest /无效。

–汤姆·萨利巴(Tom Saleeba)
16-9-27在1:13

我发现带有--delete或--delete-事件的事件由于某些错误而无法删除:“遇到IO错误-跳过文件删除”。要解决此问题,请添加--ignore-errors选项并分别调试错误

– MHT
16 Dec 18'在13:25

完美的作品!即使它可以正常工作,我还是建议始终在运行rsync之前使用-n,--dry-run选项,尤其是在涉及这些选项(--delete)时。这将避免任何可能的头痛:)。

– ivanleoncz
17年5月31日在16:36

@TheBicentennialMan -a表示-r。

–x-yuri
19-3-27在20:51



@ oemb1905芽,您的情绪很好,但这是人类深入挖掘您的旗帜的土地-avWeqr不正确:-同时使用vq,这很冗长,但被安静和理智地取消。 -a是-rlptgoD的简写...因此,第二次使用r是多余的。 -e被使用了两次,也很摘要:您在阅读时使用-avWeqr == -aW。

–威廉姆斯
19年11月16日在0:12

#2 楼

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

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

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


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

UPDATE

我发现delete选项仅用于TARGET(如果从中删除了一些文件)来源,rsync --delete将它们从TARGET中删除。以及手册页中提到的deleteafterbefore选项:

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

评论


谢谢回复!!您是指rsync的“删除”选项吗?为什么我不能仅对rsync使用“删除”选项?

–user254251
2014年6月3日下午6:03

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

–shgnInc
2014年6月3日下午6:44

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

–user254251
2014年6月3日在8:02

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

–shgnInc
2014年6月3日9:48



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

–user254251
2014年6月4日下午5:13

#3 楼

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


它将仅复制增量数据。
如果从源删除了任何数据,它将删除。
如果在目标位置删除了任何数据,它将再次从源复制。
基本上,该命令将使两个环境保持同步。 br />
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


评论


我认为-W使其不只复制增量数据,而总是复制整个文件。

–图兰斯·科尔多瓦(TulainsCórdova)
2015年11月25日19:27

我通过执行以下命令得到此错误:rsync:无法执行--delete-before:无此类文件或目录(2)

–田俊杰
2015年12月10日在2:34



#4 楼

如果rsync scync期间出现任何错误,即使您使用--delete--delete-after--delete-before,rsync也不会正确删除其应有的文件。 。

我的大部分错误是由于与非Linux文件系统同步时使用了--perms选项引起的。当我用--perms替换--no-perms时,这些错误消失了,然后删除了。

从Linux文件系统同步到另一个Linux文件系统时,--perms可以,但是如果要从从Linux到非Linux文件系统(例如NTFS,FAT),--perms会导致错误,因为rsync无法在非Linux文件系统上设置Linux权限。同样,错误=没有删除。如果在那之后仍然出现错误,并且无法弄清楚如何解决这些错误,则可以运行专门用于删除不同步文件的命令:

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


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

评论


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

–user254251
19年8月6日在1:35



@ user254251-我不确定。我想这取决于它真正“提前删除”的时间。如果在删除开始之前遇到一些错误,那您就搞砸了。我的建议是,除非可以,否则请尽量避免使用NTFS,除非您很痛苦。 NTFS到NTFS可以正常工作。用于Linix的NTFS可以正常工作。避免将“ Linux文件系统”改为“非Linux文件系统”;确保正确删除是一件很痛苦的事情。您可以完成此操作,但是我认为,仅将目标驱动器格式化为EXT4并不值得麻烦。

–Lonnie Best
19年8月7日在16:06



#5 楼

命令
$ 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 / remote_only已被删除,文件local / local_only已同步。

#6 楼

/source/destination之后必须出现'-delete'标志。 />

-r递归

-v详细(打印到屏幕)

-p权限

-t时间(使用时间而不是校验和'c')

-h可读的

-E扩展信息(.Mac上的颜色标签)