cp -a 在符号链接上的意外行为

cp -a 在符号链接上的意外行为

从增量备份复制符号链接时,可能会发生意外行为。例如:

# 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还有更优雅的方法来克隆目录树作为备份。

相关内容