rsync
复制了大量文件,但是我的操作系统(Ubuntu)意外重启。 重新启动后,我再次运行
rsync
,但是从终端的输出中,我发现rsync
仍然复制了以前已经复制过的内容。但是我听说rsync
能够找到源和目标之间的差异,因此只能复制差异。因此,我想知道rsync
是否可以恢复上一次剩余的内容?#1 楼
首先,关于问题的“恢复”部分,--partial
只是告诉接收方,如果发送方消失了,就好像它们已完全传输一样,则保留部分传输的文件。传输文件时,它们会暂时作为隐藏文件保存在其目标文件夹(例如
.TheFileYouAreSending.lRWzDC
)中,或者如果设置了--partial-dir
开关,则将其另存为特定选择的文件夹。当传输失败并且未设置--partial
时,此隐藏文件将保留在目标文件夹中,并使用该加密名称,但如果设置了--partial
,则该文件将重命名为实际的目标文件名(在这种情况下为TheFileYouAreSending
),甚至尽管文件不完整。关键是您以后可以通过使用--append
或--append-verify
再次运行rsync来完成传输。因此,
--partial
本身不会继续失败或取消的传输。要恢复它,您必须在下一次运行中使用上述标志之一。因此,如果您需要确保目标不会包含看起来不错但实际上不完整的文件,则不应使用--partial
。相反,如果要确保您永远不会留下隐藏在目标目录中的杂散失败文件,并且知道以后可以完成传输,则--partial
可以为您提供帮助。关于上述
--append
开关,这是实际的“恢复”开关,无论是否也使用--partial
,都可以使用它。实际上,当您使用--append
时,不会创建任何临时文件。文件直接写入其目标。在这方面,如果传输失败,则--append
会产生与--partial
相同的结果,但不会创建那些隐藏的临时文件。因此,总而言之,如果您要移动大文件,并且希望该选项从
rsync
停止的确切点恢复取消或失败的rsync操作,则需要在下次尝试时使用--append
或--append-verify
开关。 /> 正如@Alex指出的那样,由于版本3.0.0
rsync
现在具有一个新选项--append-verify
,其行为类似于--append
在该开关存在之前所做的事情。您可能总是希望得到--append-verify
的行为,因此请使用rsync --version
检查版本。如果您使用的是Mac,而不使用rsync
中的homebrew
,则您(至少包括El Capitan在内)将使用旧版本,并且需要使用--append
而不是--append-verify
。为什么他们没有在--append
上保持这种行为,而是将其命名为新来者--append-no-verify
,这有点令人困惑。无论哪种方式,版本3之前的--append
上的rsync
都与较新版本上的--append-verify
相同。--append-verify
并不危险:它将始终读取和比较两端的数据,而不仅仅是假设它们是重新等于。它使用校验和执行此操作,因此在网络上很容易,但是它确实需要读取电线两端的共享数据量,然后才能通过追加到目标实际恢复传输。第二,您说过“您听说rsync能够找到源和目标之间的差异,因此只需复制差异即可。”
没错,这叫做增量传输,但这是另一回事。要启用此功能,请添加
-c
或--checksum
开关。使用此开关后,rsync将检查线路两端存在的文件。它分块执行此操作,比较两端的校验和,如果校验和不同,则仅传输文件的不同部分。但是,正如@Jonathan指出的那样,只有在两端文件大小相同时才进行比较-不同大小将导致rsync上传整个文件,并覆盖具有相同名称的目标。最初,这需要在两端进行一点计算,但是,例如,如果您经常备份非常大的文件(固定大小的文件,其中经常包含较小的更改),则可以非常有效地减少网络负载。想到的例子是在虚拟机或iSCSI目标中使用的虚拟硬盘驱动器映像文件。
值得注意的是,如果您使用
--checksum
传输一批对目标系统来说是全新的文件, rsync仍将在传输它们之前在源系统上计算它们的校验和。为什么我不知道:) 因此,简而言之:
如果您经常使用rsync只是“将内容从A移动到B”,并希望选择取消该操作,然后再恢复操作,不要使用
--checksum
,而要使用--append-verify
。如果您经常使用rsync备份内容,那么使用
--append-verify
可能对您没有多大帮助,除非您习惯于发送大小不断增加但写入后很少修改的大文件。作为一个额外的提示,如果您要备份到支持快照的存储(例如btrfs
或zfs
),则添加--inplace
开关将帮助您减小快照大小,因为不会重新创建更改的文件,而是将更改的块直接写入旧文件那些。如果要避免仅在进行较小更改时rsync在目标上创建文件副本,此开关也很有用。 使用
--append-verify
时,rsync的行为就像在所有相同大小的文件上一样。如果它们的修改或其他时间戳不同,它将用源覆盖目标,而无需进一步检查这些文件。 --checksum
将比较名称和大小相同的每个文件对的内容(校验和)。更新2015-09-01更改为反映@Alex提出的观点(谢谢!)
已更新2017-07-14进行了更改,以反映@Jonathan的观点(谢谢!)
评论
这说--partial就足够了。
– Cees Timmerman
2015年9月15日17:21
打开选项卡526使用--partial选项告诉rsync保留部分文件,这将使文件的其余部分的后续传输更快。更简单的文档
– Cees Timmerman
2015年9月16日15:36
@CMCDragonkai实际上,请查看下面有关--partial-dir的亚历山大答案-看起来这是完美的子弹。我可能完全错过了一些东西;)
–DanielSmedegaardBuus
16年5月10日在19:31
@DanielSmedegaardBuus我在一个缓慢的连接上对其进行了自我测试,这是我仅用--partial看到的结果:rsync将文件复制到临时名称中,连接中断,远程rsync最终将该文件移至常规名称并退出,然后在使用--partial和不使用--append的情况下重新运行时,将使用部分传输的远程文件的副本来初始化新的临时文件,然后该副本从连接终止的地方继续。 (Ubuntu 14.04 / rsync 3.1)
–伊兹卡塔
16年8月23日在15:18
您对所描述的--checksum行为的信心水平如何?据该人介绍,与确定增量传输相比,决定与传输有关的文件更多(与rsync的默认行为有关)。
–乔纳森·Y。
17年6月14日在5:48
#2 楼
TL; DR:只需按照rsync手册页的建议指定部分目录:
--partial-dir=.rsync-partial
更长的解释:
实际上有一个内置功能可用于此选项使用
--partial-dir
选项,它比--partial
和--append-verify
/ --append
替代项具有多个优点。rsync手册页的摘录:
--partial-dir=DIR
A better way to keep partial files than the --partial option is
to specify a DIR that will be used to hold the partial data
(instead of writing it out to the destination file). On the
next transfer, rsync will use a file found in this dir as data
to speed up the resumption of the transfer and then delete it
after it has served its purpose.
Note that if --whole-file is specified (or implied), any par-
tial-dir file that is found for a file that is being updated
will simply be removed (since rsync is sending files without
using rsync's delta-transfer algorithm).
Rsync will create the DIR if it is missing (just the last dir --
not the whole path). This makes it easy to use a relative path
(such as "--partial-dir=.rsync-partial") to have rsync create
the partial-directory in the destination file's directory when
needed, and then remove it again when the partial file is
deleted.
If the partial-dir value is not an absolute path, rsync will add
an exclude rule at the end of all your existing excludes. This
will prevent the sending of any partial-dir files that may exist
on the sending side, and will also prevent the untimely deletion
of partial-dir items on the receiving side. An example: the
above --partial-dir option would add the equivalent of "-f '-p
.rsync-partial/'" at the end of any other filter rules.
默认情况下,rsync使用随机的临时文件名传输失败时被删除。如前所述,使用
--partial
可以使rsync像成功传输一样保留不完整的文件,以便以后可以使用--append-verify
/ --append
选项将其追加。但是,这是次优的原因有很多。您的备份文件可能不完整,并且如果不检查仍必须保持不变的远程文件,就无法知道。 br />
如果您尝试使用
--backup
和--backup-dir
,则刚刚添加了此文件的新版本,甚至从未退出过其版本历史记录。但是,如果我们使用
--partial-dir
,rsync将保留临时的部分文件,并在您下次运行该部分文件时恢复使用该部分文件的下载,因此我们不会遭受上述问题的困扰。评论
关于--partial-dir和I / O数量和/或磁盘写入操作(CF,SSD等)的很少了解:1.当路径与以下文件不在同一分区(另一个磁盘,RAM驱动器等)中时文件同步后,完成后将在指定目录和目标之间进行文件复制; 2.当涉及大文件时,建议使用相对路径(位于同一分区中-而不是符号链接等); 3.使用临时存储(例如RAM驱动器)时,还应注意,要同步的文件将受到临时存储可用空间的限制。
–赫尔德·玛加良斯
20-4-21在8:44
#3 楼
您可能想在命令中添加-P
选项。从
man
页面:--partial By default, rsync will delete any partially transferred file if the transfer
is interrupted. In some circumstances it is more desirable to keep partially
transferred files. Using the --partial option tells rsync to keep the partial
file which should make a subsequent transfer of the rest of the file much faster.
-P The -P option is equivalent to --partial --progress. Its pur-
pose is to make it much easier to specify these two options for
a long transfer that may be interrupted.
因此,代替:
sudo rsync -azvv /home/path/folder1/ /home/path/folder2
执行:
sudo rsync -azvvP /home/path/folder1/ /home/path/folder2
当然,如果您不想要进度更新,您可以只使用
--partial
,即:sudo rsync --partial -azvv /home/path/folder1/ /home/path/folder2
评论
@Flimm不太正确。如果存在中断(网络或接收方),则在使用--partial时,将保留部分文件,并在恢复rsync时使用该文件。在联机帮助页中:“使用--partial选项告诉rsync保留部分文件,该文件应该使得随后的文件其余部分的传输更快。”
–gaoithe
15年8月19日在11:29
@Flimm和@gaoithe,我的回答不太准确,而且绝对不是最新的。我已经更新它以反映版本3 +的rsync。需要强调的是,--partial本身不会恢复失败的传输。查看我的答案以获取详细信息:)
–DanielSmedegaardBuus
2015年9月1日14:11
@DanielSmedegaardBuus我尝试了-P就我而言就足够了。版本:客户端具有3.1.0,服务器具有3.1.1。我使用ctrl-c中断了单个大文件的传输。我想我缺少了一些东西。
– Guettli
2015年11月18日在12:28
为什么是vv?即v使用2次?
–mrgloom
19年8月23日在11:51
哪里rsync使用-azvvP保存文件的一部分?
–mrgloom
19年8月23日在11:56
#4 楼
迟到了,但是我遇到了相同的问题,却找到了不同的答案。--partial
标志(rsync -h
中的“保留部分传输的文件”)对于大型文件很有用,而--append
(“将数据附加到较短的文件中”),但是问题是有关大量文件。为避免已经复制的文件,请使用
-u
(或--update
:“跳过接收器上较新的文件“)。评论
自我注意:请勿将--ignore-existing与--append结合使用。即使文件不完整,Rsync也会以您满意的方式保留您被中断的文件。这让我有些头疼地意识到。这是您经常使用一堆预配置选项的缺点。
– Sridhar Sarnobat
19/12/24在6:13
#5 楼
我认为您正在强行呼叫rsync
,因此当您再次调用它时,所有数据都将被下载。使用--progress
选项仅复制那些未复制的文件,并使用--delete
选项删除任何文件(如果已复制),现在它在源文件夹中不存在... rsync -avz --progress --delete -e /home/path/folder1/ /home/path/folder2
如果您正在使用ssh登录到其他系统并复制文件,
rsync -avz --progress --delete -e "ssh -o UserKnownHostsFile=/dev/null -o \
StrictHostKeyChecking=no" /home/path/folder1/ /home/path/folder2
让我知道我对这个概念的理解是否有任何错误...
评论
您能否编辑答案并解释您的特殊ssh调用的作用,以及为什么建议这样做?
–法比恩
2013年6月14日12:12
@Fabien他告诉rsync设置两个ssh选项(rsync使用ssh进行连接)。第二个命令告诉ssh如果所连接的主机未知(不存在于“已知主机”文件中),则不要提示您进行确认。第一个告诉ssh不要使用默认的已知主机文件(该文件为〜/ .ssh / known_hosts)。他改用/ dev / null代替,它当然总是空的,并且因为ssh在那里找不到主机,所以它通常会提示您进行确认,因此选择了第二个。连接后,ssh将现在已知的主机写入/ dev / null,立即有效地将其忘记:)
–DanielSmedegaardBuus
2014年12月7日,0:12
...但是您可能想知道它会对rsync操作本身产生什么影响(如果有)。答案是否定的。它仅用于不将您要连接的主机添加到SSH已知主机文件中。也许他是一名系统管理员,经常连接到大量新服务器,临时系统或其他任何东西。我不知道 :)
–DanielSmedegaardBuus
2014年12月7日,0:23
“使用--progress选项仅复制那些未复制的文件”是什么?
– moi
16年5月10日在13:49
这里有几个错误;一个非常严重:--delete将删除目标中源文件中不存在的文件。不太严重的是--progress不会修改事物的复制方式;它只是在复制文件时为您提供进度报告。 (我修复了严重的错误;将其替换为--remove-source-files。)
–Paul d'Aoust
16 Nov 17在22:39
#6 楼
我正在使用这个简单的脚本。随意调整某些标志和/或对其进行参数化。#!/bin/bash
while [ 1 ]
do
rsync -avz --partial [source] [dest]:
if [ "$?" = "0" ] ; then
echo "rsync completed normally"
exit
else
echo "Rsync failure. Backing off and retrying..."
sleep 180
fi
done
评论
是的,rsync不会再次复制已经复制的文件。在少数情况下,其检测可能会失败。它是否复制了所有已经复制的文件?您使用了哪些选项?源文件系统和目标文件系统是什么?如果在复制完所有内容后再次运行rsync,会再次复制吗?@吉尔斯:谢谢! (1)我想我看到rsync从终端上的输出再次复制了相同的文件。 (2)选项与我的另一篇文章相同,即sudo rsync -azvv / home / path / folder1 / / home / path / folder2。 (3)源和目标都是NTFS,购买源是外部HDD,目标是内部HDD。 (3)现在正在运行,尚未完成。
还有--partial标志可以恢复部分传输的文件(适用于大文件)
@Tim在我头顶上,至少存在时钟偏移和时间分辨率差异(FAT文件系统的常见问题是以2秒为增量存储时间,--modify-window选项可以解决此问题)。 />
如果您没有/或/。在文件源路径参数的末尾,它将在与源目录同名的子目录中进行额外的复制