如何使用 rsync 复制目录树并创建文件的硬链接?

如何使用 rsync 复制目录树并创建文件的硬链接?

有时,我必须对服务器上的数据文件执行几项大型迁移更改,我正在寻找一种好的方法来实现这一点。我考虑使用 rsync 从根数据文件夹开始复制目录结构,创建指向所有原始文件的硬链接(其中一些文件相当大),然后我可以在目标树中仅覆盖需要迁移的文件。最后,我可以通过两个mv操作安全地从旧文件切换到新文件。

但是,我似乎无法让 rsync 做到这一点。我试过

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp

但是 rsync 不会创建文件的硬链接,而是会完全复制它们。使用相同的源和链接目标目录是否存在问题?

答案1

rsync是一个强大的工具,但不幸的是,它对某些路径名非常挑剔。

如果$DATA是绝对路径(即以 开头/),则正确的命令行是:

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp

[现在,简单说一下 的奇怪之处。请注意添加到源参数的rsync尾部。这告诉要使用/rsync内容源目录,而不是源目录本身。 (我假设它$DATA不包含尾随的/.)在本例中,我们想要处理内容,因此我们添加尾随的/.]

另一方面,如果$DATA是相对路径(即它不以 开头/),那么 Sean R 的评论--link-dest是正确的:link-dest 路径是相对于目的地路径,因此您可以使用以下命令:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp

编辑

最后要注意的是,事实证明,rsync我给出的第二个命令行无论是否$DATA是绝对路径都应该起作用,因为basename它不关心路径是绝对路径还是相对路径。

答案2

你想要的是“cp -al”:

cp -al $DATA/ $DATA/../upgrade_tmp/
  • -a 递归如下rsync -a
  • -l 将硬链接文件而不是复制它们。

答案3

事实证明,使用 比使用其他工具更难做到这一点rsync。 的正确答案rsync是 Steven Monai 的,但最简单的方法是在不是有效选项的系统上使用cp -al或:pax -rwl-lcp

pax -rwl $DATA $DATA/../upgrade_tmp

或者

cp -al $DATA/ $DATA/../upgrade_tmp/

答案4

这个对我有用:

$ rsync --hard-links --recursive --link-dest=/local user@host:/remote/ /local

我使用 rsync 版本 3.1.0。

男人

--硬链接

告诉 rsync 在传输中查找硬链接文件,如果没有这个选项,传输中的硬链接文件将被视为单独的文件。

–link-dest=目录

未更改的文件从 DIR 硬链接到目标目录。文件的所有保留属性(例如权限、可能的所有权)必须相同,才能将文件链接在一起

相关内容