在本地复制大型目录树?cp还是rsync?


230

我必须复制一个大目录树,大约1.8 TB。都是本地的。出于习惯我会用rsync,但是我想知道是否有很多意义,是否应该使用cp

我担心权限和uid / gid,因为它们必须保留在副本中(我知道rsync会这样做)。以及符号链接之类的东西。

目的地是空的,因此我不必担心有条件地更新某些文件。这些都是本地磁盘,因此我不必担心ssh或网络。

我之所以会不喜欢rsync,是因为rsync可能做的比我需要的更多。rsync校验和文件。我不需要它,并且担心它可能需要比cp更长的时间。

那么你估计,rsync还是cp


2
如果rsync完全按照您的要求执行操作,如果您已经非常熟悉该特定应用程序的用法,并且它的运行速度足够快以满足您的喜好,那么为什么还要切换呢?
2009年

2
因为我担心rsync会比cp花费更长的时间,因为rsync会做很多校验来确定cp不会
Rory

1
与磁盘/网络I / O相比,校验和的CPU开销很小。除非磁盘位于同一系统上,并且OS可以在总线控制器中进行一些巧妙的驱动器驱动器复制,
马丁·贝克特

3
对大小和时间戳检查不同的文件进行校验和。如果您偏执狂(例如在复制过程中停电之后),可以对所有文件强制执行校验和,但是在本地传输时,通常比从头开始要慢。
korkman,2012年

3
也许他对改善自己的工作流程感到好奇,并没有以为自己知道一切就把头埋在沙子里。这句话让我很烦。
Martin Konecny 2012年

Answers:


204

我将使用rsync,因为这意味着如果它由于任何原因被中断,那么您可以以很少的成本轻松地重新启动它。而且由于是rsync,它甚至可以通过大文件部分重启。正如其他人提到的那样,它可以轻松排除文件。保存大多数内容的最简单方法是使用-a标志“存档”。所以:

rsync -a source dest

尽管UID / GID和符号链接由保留-a(请参阅参考资料-lpgo),但您的问题暗示您可能需要文件系统信息的完整副本;并且-a不包含硬链接,扩展属性或ACL(在Linux上),也不包含上述资源资源派生(在OS X上。)因此,对于文件系统的可靠副本,您需要包括以下标志:

rsync -aHAX source dest # Linux
rsync -aHE source dest  # OS X

默认的cp将再次启动,尽管该-u标志将“仅在SOURCE文件比目标文件新或缺少目标文件时复制”。并且-a(存档)标志将是递归的,如果您必须重新启动并保留权限,则不会重新复制文件。所以:

cp -au source dest

5
cp的-u标志可能不是最佳解决方案,因为它不会检测到部分复制/损坏的文件。关于rsync的好处是您可以让md5对文件求和以检测差异。
乍得·休尼卡特

3
添加-w(--whole-file)选项将加速中断的rsync,因为它将仅复制文件而不是校验和。
hayalci 2010年

13
实际上,rsync会检测本地传输并启用整个文件复制,而无需自动进行校验和。
korkman

22
--progress真的很方便!
马特

12
-P或--progress分别显示每个文件的进度。它对于复制大文件很有用,而不是复制许多(数千个)小文件,因为这意味着您将读取更多的输出。它不会显示所有合并文件的总体进度。
SPRBRN

106

复制到本地文件系统时,我总是使用以下rsync选项:

# rsync -avhW --no-compress --progress /src/ /dst/

这是我的理由:

-a is for archive, which preserves ownership, permissions etc.
-v is for verbose, so I can see what's happening (optional)
-h is for human-readable, so the transfer rate and file sizes are easier to read (optional)
-W is for copying whole files only, without delta-xfer algorithm which should reduce CPU load
--no-compress as there's no lack of bandwidth between local devices
--progress so I can see the progress of large files (optional)

我已经看到使用以上rsync设置比以下tar命令将传输速度提高了17%,这是另一个答案所建议的:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

1
我遇到以下错误:rsync: --no-compress: unknown option@Ellis Percival。
alper

这很快减轻。比做更快rm -rf /src/
dgo

2
像@alper一样,--no-compress不是我的rsync版本的选项(在CentOS 7中);我改用--compress-level = 0。
保罗

79

当我不得不复制大量数据时,通常会结合使用tar和rsync。第一步是将其焦油化,如下所示:

# (cd /src; tar cf - .) | (cd /dst; tar xpf -)

通常有大量文件,由于某些原因,有些tar无法处理。也许该过程将被中断,或者如果它是文件系统迁移,则您可能希望在实际迁移步骤之前进行初始复制。无论如何,在执行初始复制之后,我会执行rsync步骤来同步所有内容:

# cd /dst; rsync -avPHSx --delete /src/ .

请注意,后面的斜杠/src/很重要。


6
+1我发现大拷贝的tar通常比rsync快。我也喜欢用最终的rsync结束的想法。
杰夫·弗里茨

2
如果目标目录为空,则tar是一个不错的选择。尽管我的方式是:cd $ DSTDIR; tar c -C $ SRCDIR。| 焦油
asdmin

19
这就是这种方法的优点。您不需要加倍空间,因为您实际上从未创建过中间tar文件。管道之前的tar将数据打包并将其流传输到stdout,管道之后的tar从stdin抓取数据并将其解压缩。
乍得·休尼卡特

4
我对12gb的传输做了cp -a,对于42gb的传输做了这种方法。焦油法大约需要1/4的时间。
NGaida 2014年

3
我还放在pv中间,以便能够查看进度,并使用估算所有数据的大小df。我还使用了--numeric-owner,因为源磁盘是来自另一个系统,并且我不想tar弄乱所有者:tar -C /old-path --numeric-owner -S -c . | pv -tpeba -s 100G | tar -C /new-path --numeric-owner -S -xp
PetrPudlák16年

14

同步

这是我使用的rsync,我更喜欢使用cp作为简单命令,而不是这个。

$ rsync -ahSD --ignore-errors --force --delete --stats $SRC/ $DIR/

cpio

cpio是一种更安全的方法。它大约和tar一样快,也许更快一些。

$ cd $SRC && find . -mount -depth -print0 2>/dev/null | cpio -0admp $DEST &>/dev/null

柏油

这也很好,并且在读取失败时继续。

$ tar --ignore-failed-read -C $SRC -cf - . | tar --ignore-failed-read -C $DEST -xf -

请注意,所有这些仅用于本地副本。


为什么要对rsync使用-S和-D标志?
miyalys 2015年

7

无论您喜欢什么。-a决定使用时,请不要忘记开关cp

如果您真的需要答案:我会使用rsync,因为它更加灵活。需要在复制完成之前关闭吗?只需按ctrl-c,然后尽快恢复。需要排除一些文件吗?只需使用--exclude-from。需要更改所有权或权限吗?rsync将为您做到这一点。


-p标志又做什么?
罗里

1
它将保留服务器的所有权,时间戳和权限。
innaM 2009年

5
cp -a会更好。
David Pashley,2009年

确实。答案相应更改。
innaM 2009年

7

rsync命令始终在其传输的每个字节上计算校验和。

命令行选项--checksum仅与文件的校验和是否用于确定要传输的文件有关,即:

-c, --checksum 根据校验和而不是修改时间和大小跳过”

手册页还说:

请注意,rsync始终通过检查其整个文件校验和来验证每个传输文件是否在接收方正确重建,但是自动传输后验证与该选项的传输前验证无关。要被更新?” 校验。

因此rsync,即使-c/ --checksum选项为“ off” ,也总是在接收方计算整个文件的校验和。


14
尽管您的帖子在此处添加了一些有趣的信息,但咆哮和侮辱降低了帖子的价值。该网站不是非建设性人士的论坛。如果您能够修改源,那么您是否已将修改作为补丁提交?您是否在github上发布了版本?如果您对此有如此强烈的感觉,那么尝试做一些更具建设性的事情而不是不必要地侮辱可能会更好。
Zoredache

是的,最后一段不是真正必要的。
宣威航班

6

rsync -aPhW --protocol=28通过RSYNC帮助加快大型副本的速度。我总是进行rsync,因为想到进入90GiB的途中,它的中断使我远离CP


2
在该命令字符串中使用旧协议的价值是什么?
ewwhite

1
在Mac机器上,较早版本的Rsync会挂在某些较新的rsync协议版本(例如29)上。告诉它移至旧协议会使其不再反复检查。
oneguynick

我猜数字28不再有效吗?
SPRBRN


5

该线程非常有用,并且由于有太多选项可以实现结果,因此我决定对其中的几个进行基准测试。我相信我的结果可以帮助其他人更快地了解到什么。

要移动532Gb之间分布数据的1753200个文件,我们有那些时间:

  • rsync 花了232分钟
  • tar 花了206分钟
  • cpio 花了225分钟
  • rsync + parallel 花了209分钟

就我而言,我更喜欢使用rsync + parallel。我希望这些信息可以帮助更多的人在这些替代方案中做出选择。

完整的基准测试在这里发布


找不到404页
Amedee Van Gasse

1
感谢@AmedeeVanGasse在您报告之后不久,URL已被修复:)
arjones 18'Apr

为什么不进行基准测试cp?这是问题的标题!
calandoa '18

@calandoa我认为这cp是不安全的,即:当它崩溃时,您必须重新开始,这就是我偏爱可以恢复的选项的方式,rsync我最喜欢ergo :)
arjones

3

在本地进行本地目录复制时,我的经验是“ cp -van src dest”比rsync快20%。至于可重启性,这就是“ -n”的作用。您只需要rm部分复制的文件。除非是ISO或类似的东西,否则不会感到痛苦。


2

ARJ太老了!!我真的怀疑ARJ和/或rsync是否会提高性能。

绝对我经常使用cpio:

find . -print | cpio -pdm /target/folder

这几乎比CP快,绝对比tar快,而且不需要任何管道。


2
“原始的cpio和find实用程序是由Dick Haight在AT&T的Unix支持小组工作时编写的。它们最初出现在1977年的PWB / UNIX 1.0中”-FreeBSD的cpio手册页。
克里斯S

3
cpio不幸的是,文件上限为8GB。

无需使用任何管道 ”(原文如此)。除了find列出的命令以外,其中还有一个管道:find . -print | cpio -pdm /target/folder
沃伦(Warren)

1

您肯定想尝试rclone。这东西快疯了:

sudo rclone sync /usr /home/fred/temp -P -L --transfers 64

Transferred:       17.929G / 17.929 GBytes, 100%, 165.692 MBytes/s, ETA 0s
Errors:                75 (retrying may help)
Checks:            691078 / 691078, 100%
Transferred:       345539 / 345539, 100%
Elapsed time:     1m50.8s

这是LITEONIT LCS-256(256GB)SSD的本地副本。

您可以添加--ignore-checksum第一次运行以使其更快。



0

tar 也可以完成这项工作,但不会像rsync那样从中断中恢复。


一个旧的答案,但是TAR不是用于创建文件的压缩存档吗?如何使用它传输rsync或cp等文件?
宣威航班

@SherwinFlight CD来源; tar cf-。| (cd dest; tar xf-)

0

如果使用ARJ怎么办?

arj a -jm -m1 -r -je filepack /source

-jm -m1压缩级别在哪里并-je使其可执行。现在,您已封装了bash文件。

然后提取到目标地图

filepack -y  

生成源映射的位置-y(始终接受,覆盖,跳过等)

然后,如果可能的话,可以将文件包ftp ftp到目标区域并执行它。


1
阿吉 那不是在80年代消失了吗?
迈克尔·汉普顿

也许早在90年代,如果你相信维基百科
马特

0

有一些可以应用于的提速rsync

避免

  • -z/ --compress:压缩将只加载CPU,因为传输不是通过网络而是通过RAM。
  • --append-verify:恢复中断的传输。这听起来像是个好主意,但它有一个危险的失败案例:任何大小等于或大于源的目标文件都将被忽略。同样,它在最后检查整个文件,这意味着--no-whole-file在添加危险的失败案例时不会明显加快速度。

采用

  • -S/ --sparse:将空序列变成稀疏块
  • --partial或者-P--partial --progress:保存任何部分传输的文件以供将来恢复。注意:文件不会有临时名称,因此请确保在整个副本完成之前,没有其他期望使用目标的文件。
  • --no-whole-file这样需要重新发送的任何内容都会使用增量传输。读取部分传输的文件的一半通常比重新写入要快得多。
  • --inplace 避免文件复制(但前提是在整个传输完成之前没有任何内容读取目标)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.