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

Jea*_*let 28 rsync hardlink mac-osx

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

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

rsync -a --link-dest=$DATA $DATA $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*day 26

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

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

rsync -a --link-dest=$DATA $DATA/ $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)

[现在,只是简要介绍一下它rsync的奇怪之处。请注意/添加到 source 参数的尾随。这告诉rsync使用源目录的内容,而不是源目录本身。(我假设它$DATA尚未包含尾随/。)在这种情况下,我们想要处理内容,因此我们添加尾随/。]

另一方面,如果$DATA是相对路径(即它不以 a 开头/),那么 Sean R 的评论--link-dest是:链接目标路径是相对于目标路径解释的,因此您将使用以下内容:

rsync -a --link-dest=../`basename $DATA` $DATA/ $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)

编辑

最后一点,事实证明,rsync无论是否$DATA是绝对路径,我给出的第二个命令行都应该可以工作,因为basename不关心路径是绝对路径还是相对路径。


Sea*_*der 18

你想要的是“cp -al”:

cp -al $DATA/ $DATA/../upgrade_tmp/
Run Code Online (Sandbox Code Playgroud)
  • -a 递归 rsync -a
  • -l 将硬链接文件而不是复制它们。


Jea*_*let 9

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

pax -rwl $DATA $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)

或者

cp -al $DATA/ $DATA/../upgrade_tmp/
Run Code Online (Sandbox Code Playgroud)


Sea*_*der 7

--link-dest选件rsync是相对于目标目录,而不是当前目录。所以你想要的是:

rsync -a --link-dest=../`basename $DATA` $DATA $DATA/../upgrade_tmp
Run Code Online (Sandbox Code Playgroud)

  • 手册页说`--link-dest` 选项,**if relative**,是相对于目标目录的。就我而言,这是绝对的。即使使它相对于目标目录也不能使这项工作。 (2认同)