从增量备份复制符号链接时,可能会发生意外行为。例如:
# mkdir 0 1 2
# touch 0/a
# ln 0/a 0/b
# touch 1/a
# ln 1/b 1/a
所以目录0
看起来像
a
b->a
目录1
看起来像
a->b
b
现在我们运行
# cp -a 0/. 2
# cp -a 1/. 2
预期/预期的行为是该目录2
与 相同1
,但它实际上包含两个链接
a -> b
b -> a
当我复制 /usr/ 目录的一些 rsync 备份时,实际上发生了这种情况。去年,/usr/share/zoneinfo 目录经历了多次不同的符号链接切换。看起来虽然cp -a
不遵循 SOURCE 中的符号链接,但它可能在 DEST 中遵循它们。
有没有办法在这里得到适当的结果?
(顺便说一句,rsync
做得正确,但我也想使用--reflink=always
标志......)cp
答案1
当您执行此操作时,cp -a 1/. 2
它是b
首先执行的,但由于b -> a
已经存在,因此内容b
会被写入a
.然后a->b
考虑这会导致a
符号链接覆盖a->b
。如果你cp -a 1/. 2
再次运行,你应该得到"Too many levels of symbolic links"
.
所以,是的,cp
遵循目的地中的符号链接。您可以尝试--remove-destination
为您的 MWE 正确解决问题。但是,如果您将符号链接作为目标中的目录组件,它们将不会被--remove-destination
.
真正的问题是“为什么要做这样的事情?”我只使用cp -a
空目录作为目标。此外,支持的文件系统--reflink=always
还有更优雅的方法来克隆目录树作为备份。