我如何使用rsync来复制一个目录树,创build硬链接到文件?

有时,我不得不在我的服务器上的数据文件上执行一些大的迁移更改,我正在寻找一个很好的方法来做到这一点。 我正在考虑使用rsync从根数据文件夹开始复制我的目录结构,创build所有原始文件的硬链接(其中一些文件比较大),而且只能在目标树中覆盖需要迁移的文件。 最后,我可以安全地从两个mv操作从旧文件切换到新文件。

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

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

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

rsync是一个强大的工具,但不幸的是,它的一些path名称很奇怪。

如果$DATA是绝对path(即以/开始),那么使用正确的命令行是:

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

[现在,简单的说一下rsync的奇怪。 注意尾部/添加到源参数。 这告诉rsync使用源目录的内容 ,而不是使用源目录本身。 (我假设$DATA还没有包含尾部/ 。)在这种情况下,我们要处理的内容,所以我们添加尾部/ 。]

另一方面,如果$DATA是一个相对path(即它不以a开始),那么Sean R关于--link-dest的注释--link-dest--link-dest :link-destpath被解释为相对于目标path,所以你会使用以下内容:

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

编辑

最后一点,事实certificate,我给出的第二个rsync命令行应该工作,不pipe$DATA是否是绝对path,因为basename不关心path是绝对path还是相对path。

你想要的是“cp -al”:

 cp -al $DATA/ $DATA/../upgrade_tmp/ 
  • – 像rsync -a一样recursion
  • -l将硬链接文件,而不是复制它们。

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

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

事实certificate,使用rsync比使用其他工具更困难。 rsync的正确答案是Steven Monai's,但最简单的方法是在系统上使用cp -alpax -rwl ,其中-l不是cp的有效选项:

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

要么

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

它适用于我:

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

我使用rsync版本3.1.0。

从男人 :

-硬链接

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

–link-DEST = DIR

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

首先仅在目标上创build目录:

 rsync -av --include '*/' --exclude '*' /source/ /destination/ 

然后只硬连接文件:

 cd /source find . -type f -exec ln -v {} /destination/{} \; 

使用选项-H保存硬链接并阅读联机帮助页。