我进行了快速搜索,但找不到有关此场景的任何具体信息:
假设我有一个目录(让我们忽略路径)并将其命名为 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
指向。将文件复制到(这就是您的命令正在执行的操作)不会影响此链接。A
A
A
如果您出于某种原因重命名或删除了A
,那么符号链接S
将被破坏且无法使用。如果您随后创建了其他内容,可能是一个新目录,A
在与旧目录相同的位置调用A
,那么S
将是指向该内容的符号链接。
请注意,符号链接S
与目录完全分开A
。 S
in 本身并不关心是否A
存在,也不关心它是一个文件、目录还是其他东西。你所做的任何事A
都会不是影响S
。
取消引用符号链接的行为S
(即使用它,例如通过执行ls S
)将产生不同的结果,具体取决于其内容A
(如果存在,如果是目录等)
答案3
想象一下,您有一个名为S.txt
(在某个单独的目录中)的文件,其中表示
您要查找的信息位于 目录 中
A
。
它不会受到您对目录所做的任何操作的影响A
。
符号链接非常像这样。符号链接不会受到您对其目标所做的任何操作的影响。