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

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

我必须复制一个大型目录树,大约 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。我希望这些信息能帮助更多人在这些替代方案中做出决定。

完整基准测试已发布这里

相关内容