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


23

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

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

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

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

Answers:


21

rsync 是一个功能强大的工具,但不幸的是,它奇怪地对某些路径名挑剔。

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

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

[现在,仅简要介绍一下rsync的陌生性。注意尾随/添加到源参数。这告诉rsync您使用源目录的内容,而不是源目录本身。(我假设它$DATA不包含尾部/。)在这种情况下,我们要使用内容,因此我们添加尾部/

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

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

编辑

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


1
只是一个缺少的斜线,谁会想到的...谢谢您的优美解释!
Jean-Philippe Pellet 2010年

感谢你为这个,我试过以下几个增量备份指令,像这一个,并没有发现这种怪癖的任何提及。这是唯一真正确保文件被硬链接的东西。检查ref计数> 1并且inode编号与ls -ilah
Walf 2013年

余与描述的relpath()函数中使用此结合unix.stackexchange.com/a/85068/57414到备份$SOURCE目录成$TARGET:DIR这样SOURCE='abs_path_to_backup'; TARGET='.'; rsync -a --link-dest=$(relpath $TARGET $SOURCE) $SOURCE/ $TARGET/
森S.沃森-黑格


7

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

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

糟糕,我的意思是基名,最初我有dirname。
肖恩·赖夫施奈德

1
手册页说该--link-dest选项(如果相对)相对于目标目录。就我而言,这是绝对的。即使将其相对于目标目录也无法完成这项工作。
让-菲利普·佩莱

7

事实证明,使用此rsync工具比使用其他工具更困难。正确的答案rsync是史蒂芬Monai的,但要做到这一点最简单的方法是要么使用cp -alpax -rwl其中的系统-l是不是一个有效的选项cp

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

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


2
仅代码片段是不够的,请说明其功能以及原因。
彼得说恢复莫妮卡

--hard-links告诉rsync在传输中查找硬链接文件,如果没有此选项,则将传输中的硬链接文件视为独立文件。 --link-dest = DIR不变的文件从DIR硬链接到目标目录。文件在所有保留的属性(例如权限,可能的所有权)中必须相同,以便将文件链接在一起。
亚历山大·费多罗夫

1
精彩。谢谢。实际上,我在“低质量”队列中找到了您的答案。意思是说,是否应删除您的答案,是有投票的。但是,删除的危险不仅是尝试给出格式正确的“人为”答案的原因,而且如果您想收集赞成票,也会有很大帮助。
彼得说恢复莫妮卡


2

首先仅在目的地上创建目录:

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

然后仅硬链接文件:

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

谢谢-实际上,我最好还是使用pax上面的评论中所示的方法,这似乎更容易。
Jean-Philippe Pellet 2010年

1

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


1
-H不起作用。我没有要保留在源代码树中的硬链接,我只想要源代码树的简单副本,在副本中,所有文件都硬链接到原始文件。抱歉,我原来的问题还不清楚……
Jean-Philippe Pellet 2010年

“阅读手册”是一个答案吗?:-)
meduz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.