为什么第一个 rsync 命令可以完美地使用硬链接创建/tmp/data 到 /tmp/bak的克隆,而第二个命令通过复制字节而不是硬链接来创建克隆?
rsync -a --link-dest=/tmp/data /tmp/data/ /tmp/bak/ # HARDLINKS
rsync -a -R --link-dest=/tmp/data /tmp/data/ /tmp/bak/ # REGULAR COPIES
测试/重现的步骤
cd /tmp/
rm -rf data bak
mkdir data bak
echo foo > data/foo
stat /tmp/data/foo | grep Inode
rsync -a --link-dest=/tmp/data /tmp/data/ /tmp/bak/
stat /tmp/bak/foo | grep Inode
### Note that the inode is the same as above.
rm bak/*
rsync -a -R --link-dest=/tmp/data /tmp/data/ /tmp/bak/
stat /tmp/bak/tmp/data/foo | grep Inode
### Note that the inode is different.
使用
-R
(--relative
) 标志时,所有路径都以源路径为前缀,包括任何--link-dest
路径。用你的例子来解决这个问题,
这意味着链接目标路径变为
/tmp/data/tmp/data
.cp -al /tmp/data /tmp/link
(使用和使用可以更清楚地看到这一点strace -f rsync ... --link-dest=/tmp/link
。)在这种情况下的解决方案是使用
--link-dest=/
,以便生成的起点成为您想要的--link-dest=/tmp/data
这是一个有趣的问题。
使用时
rsync -R
,它会将 复制tmp/data
到目标目录中。问题是,当 rsync 将复制时,它会首先检查文件是否存在于给定的目录中
--link-dest
:意思是,它将
/tmp/bak/*
与比较/tmp/data/*
。问题是,当您启动
rsync -R
命令时,该foo
文件不会位于可以与 /tmp/data/ 进行链接比较的位置,它将位于/tmp/bak/tmp/data/foo
,而 rsync 愚蠢地只会为它做硬链接它是给定目录的根目录(在该示例中,/tmp/data
和/tmp/bak
)。