符号链接的不确定性

符号链接的不确定性

我进行了快速搜索,但找不到有关此场景的任何具体信息:

假设我有一个目录(让我们忽略路径)并将其命名为 A。现在,我创建一个指向目录 A 的符号链接(称为 S)。我们现在应该有:

S -> A

如果我有另一个目录,假设是 B 并执行以下操作:

cp -r B/ A/

符号链接会持续存在,还是会破坏它?假设我不使用 bash 命令,而是使用 python distutils.dir_utils.copytree(B, A),符号链接 S 仍然指向 A 吗? A还是A还是变成了B?

答案1

您可以相当轻松地从命令行测试这一点:

# set up test
mkdir A
mkdir B
echo "this is A" > A/test.txt
echo "this is B" > B/test.txt
echo "this is A" > A/old.txt
echo "this is B" > B/new.txt

# contents of A change on copy
ln -s A S
cat S/test.txt
cp -r B/ A/
cat S/test.txt
cat A/test.txt

# S still points to A
ls -l S/
ls -l A/
ls -l B/

正如您将能够看到 B 中的文件覆盖 A 中的文件将对 A 和 S 产生影响。但是,当您从 A 复制文件时,A 和 B 之间名称唯一的文件将保留,因为S仍然指向A但A已经改变

符号链接指向路径。例如,如果删除 A 并保留 S,S 仍然引用不再存在的 A:

rm -rf A/
ls -l S/

如果您现在要创建一个名为 A 的文本文件,S 将指向该文本文件,因为它仍然指向路径 A。正如 Kusalananda 和 G-Man 所说,您对 A 所做的任何操作都不会影响 S。或者更明确地说你对 A 所做的任何事情都不会影响 S 指向 A 的事实

echo "new text file" > A
cat S

答案2

符号链接通过 的路径S指向。将文件复制到(这就是您的命令正在执行的操作)不会影响此链接。AAA

如果您出于某种原因重命名或删除了A,那么符号链接S将被破坏且无法使用。如果您随后创建了其他内容,可能是一个新目录,A在与旧目录相同的位置调用A,那么S将是指向该内容的符号链接。

请注意,符号链接S与目录完全分开ASin 本身并不关心是否A存在,也不关心它是一个文件、目录还是其他东西。你所做的任何事A都会不是影响S

取消引用符号链接的行为S(即使用它,例如通过执行ls S)将产生不同的结果,具体取决于其内容A(如果存在,如果是目录等)

答案3

想象一下,您有一个名为S.txt(在某个单独的目录中)的文件,其中表示

您要查找的信息位于 目录 中A

它不会受到您对目录所做的任何操作的影响A

符号链接非常像这样。符号链接不会受到您对其目标所做的任何操作的影响。

相关内容