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


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

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

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

我之所以远离rsync,是因为rsync可能比我需要的更多。 rsync校验和文件。我不需要那个,并担心它可能需要比cp更长的时间。

那你觉得怎么样? rsync 要么 cp


217
2017-07-20 14:36




如果rsync完全符合您的要求,如果您已经非常熟悉它对这个特定应用程序的使用,并且它的运行速度足以满足您的需求,那么为什么您要切换? - eleven81
因为我担心rsync需要比cp更长的时间,因为rsync会执行大量的校验和,因为cp不会这样做 - Rory
与磁盘/网络i / o相比,校验和的cpu开销很小。除非磁盘在同一系统上,并且操作系统可以在总线控制器中执行一些聪明的驱动器驱动器复制。 - Martin Beckett
校验和是在大小和时间戳检查不同的文件上完成的。如果你是偏执狂(比如在复制过程中停电后)你可以强制对所有文件进行校验和,但在本地传输时,这通常比从头开始要慢。 - korkman
也许他对改善自己的工作流程充满好奇,并且不会把自己的脑袋埋在沙里,以为他知道一切。这个评论真让我烦恼。 - Martin Konecny


答案:


我会使用rsync,因为它意味着如果它因任何原因被中断,那么你可以很容易地以很少的成本重新启动它。作为rsync,它甚至可以通过大文件重新启动。正如其他人所说,它可以轻松排除文件。保留大多数东西的最简单方法是使用 -a flag - 'archive。'所以:

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 如果必须重新启动并保留权限,(archive)标志将是递归的,而不是重新复制文件。所以:

cp -au source dest

188
2017-07-20 14:40



cp的-u标志可能不是最佳解决方案,因为它不会检测到部分复制/损坏的文件。关于rsync的好处是你可以将md5和文件相加以检测差异。 - Chad Huneycutt
添加-w(--whole-file)选项会加速中断的rsync,因为它只会复制文件而不是校验和。 - hayalci
实际上,rsync检测本地传输并启用整个文件复制而不自动校验和。 - korkman
和--progress这真的很方便! - Matt
-P或--progress单独显示每个文件的进度。它对于复制大文件很有用,而不是用于许多(数千个)小文件,因为它意味着更多的输出,你无法读取。它没有显示所有文件组合的总体进度。 - SPRBRN


复制到本地文件系统时,我总是使用以下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 -)

89
2018-05-07 19:09



我有以下错误: rsync: --no-compress: unknown option @Ellis Percival。 - alper
这很快。比这更快做到这一点 rm -rf /src/。 - dgo
像@alper一样, - no-compress不是我的rsync版本的选项(在CentOS 7中);我用--compress-level = 0代替了。 - Paul


当我必须复制大量数据时,我通常使用tar和rsync的组合。第一步是tar,它是这样的:

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

通常有大量文件,tar会因某种原因无法处理。或者,进程可能会中断,或者如果是文件系统迁移,您可能希望在实际迁移步骤之前执行初始复制。无论如何,在初始复制之后,我做了一个rsync步骤来同步它:

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

注意尾随斜杠 /src/ 很重要


78
2017-07-20 15:15



+1我发现tar对于大型拷贝通常比rsync更快。我也喜欢用最终的rsync完成的想法。 - Geoff Fritz
如果dest目录是空的,tar是一个很好的选择。虽然我的方式是:cd $ DSTDIR; tar c -C $ SRCDIR。 |柏油 - asdmin
这就是这种方法的美妙之处。您不需要加倍空间,因为您实际上从未创建过中间tar文件。管道之前的tar打包数据并将其流式传输到stdout,管道之后的tar从stdin抓取并解压缩它。 - Chad Huneycutt
我做了12gb传输的cp -a,这种方法用于42gb传输。 tar方法花费了大约1/4的时间。 - NGaida
我也说 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 - Petr Pudlák


rsync的

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

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

的cpio

这是一种更安全的方式,cpio。它和焦油一样快,也许快一点。

$ 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 -

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


13
2018-02-26 17:06



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


rsync -aPhW --protocol=28 使用RSYNC帮助加快这些大型副本的速度。我总是去rsync,因为想到90GiB的中途而且它打破让我远离CP


6
2017-07-20 16:24



在该命令字符串中使用旧协议的价值是什么? - ewwhite
在Mac机器上,旧版本的Rsync出现在一些较新的rsync协议转速上,例如29.告诉它转移到较旧的协议使得它不会反复检查。 - oneguynick
我猜这个数字28不再有效了吗? - SPRBRN


rsync 命令总是在它传输的每个字节上计算校验和。

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

-c, --checksum  基于校验和跳过,而不是模态时间和大小“

该联机帮助页也说明了这一点:

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

所以 rsync 另外,总是会计算接收方整个文件的校验和,即使是 -c/ --checksum 选项是“关闭”。


6
2017-11-28 01:20



虽然你的帖子在这里添加了一些有趣的信息,但是咆哮和侮辱会降低你帖子的价值。这个网站不是一个没有建设性的咆哮的论坛。如果您能够修改源代码,是否已将修改作为补丁提交?你有没有在github上发布你的版本?如果你对此感到如此强烈,那么如果你试图做一些更具建设性的事情而不是不必要的侮辱可能会更好。 - Zoredache
是的,最后一段并非真的有必要。 - Sherwin Flight


无论你喜欢什么。只是不要忘记 -a 当你决定使用时切换 cp

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


5
2017-07-20 14:40



-p标志又做了什么? - Rory
它将保留所有权,时间戳和权限。 - innaM
cp -a会更好。 - David Pashley
确实。答案相应改变了。 - innaM


rsync很棒,但是对于非常大的目录树存在问题,因为它将树存储在内存中。当我找到这个帖子时,我只是想看看他们是否解决了这个问题。

我还发现:

http://matthew.mceachen.us/geek/gigasync/

您也可以手动分解树并运行多个rsyncs。


5
2017-07-20 16:14



如果使用版本3,如果它很大则不会将整个树保留在内存中,它使用增量递归算法: samba.org/ftp/rsync/src/rsync-3.0.0-NEWS - Kyle Brandt♦