我必须复制一个大型目录树,大约 1.8 TB。它全部在本地。出于习惯,我会使用rsync
,但是我不知道这样做是否有意义,我是否应该使用cp
。
我担心权限和 uid/gid,因为它们必须保留在副本中(我知道 rsync 会这样做)。以及诸如符号链接之类的东西。
目标是空的,所以我不必担心有条件地更新某些文件。这都是本地磁盘,所以我不必担心 ssh 或网络。
我之所以不想使用 rsync,是因为 rsync 的功能可能超出了我的需要。rsync 校验文件。我不需要这个,而且我担心它可能比 cp 花费的时间更长。
那么,您认为怎样?rsync
或者cp
?
答案1
我会使用 rsync,因为这意味着如果它因任何原因中断,那么您可以以极低的成本轻松重新启动它。而且作为 rsync,它甚至可以在处理大型文件的过程中重新启动。正如其他人提到的,它可以轻松排除文件。保存大多数内容的最简单方法是使用标志-a
- “存档”。所以:
rsync -a source dest
-a
尽管 UID/GID 和符号链接由(参见)保留-lpgo
,但您的问题意味着您可能需要一个满的文件系统信息的副本;-a
不包括硬链接、扩展属性或 ACL(在 Linux 上)或上述内容也不资源分叉(在 OS X 上)因此,为了获得文件系统的健壮副本,您需要包含以下标志:
rsync -aHAX source dest # Linux
rsync -aHE source dest # OS X
默认 cp 将再次启动,但-u
标志将“仅当源文件比目标文件新或目标文件丢失时才复制”。并且-a
(存档)标志将是递归的,如果您必须重新启动并保留权限,则不会重新复制文件。所以:
cp -au source dest
答案2
当复制到本地文件系统时,我倾向于使用具有以下选项的 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 -)
答案3
当我需要复制大量数据时,我通常会结合使用 tar 和 rsync。第一步是将其打包成 tar,如下所示:
# (cd /src; tar cf - .) | (cd /dst; tar xpf -)
通常,如果文件数量很大,那么 tar 会因为某种原因无法处理一些文件。或者,这个过程可能会被中断,或者,如果是文件系统迁移,那么您可能希望在实际迁移步骤之前进行初始复制。无论如何,在初始复制之后,我会执行 rsync 步骤来同步所有内容:
# cd /dst; rsync -avPHSx --delete /src/ .
请注意,尾随的斜杠/src/
很重要。
答案4
这个帖子非常有用,因为有很多选项可以实现结果,所以我决定对其中几个进行基准测试。我相信我的结果可以帮助其他人了解哪种方法更快。
移动532GB分布于1,753,200 个文件我们有过这样的时刻:
rsync
耗时 232 分钟tar
耗时 206 分钟cpio
耗时 225 分钟rsync + parallel
耗时 209 分钟
就我而言,我更喜欢使用rsync + parallel
。我希望这些信息能帮助更多人在这些替代方案中做出决定。
完整基准测试已发布这里