Ubuntu

符號連結的不確定性

  • August 23, 2019

我進行了快速搜尋,但找不到有關此場景的任何具體資訊:

假設我有一個目錄(讓我們忽略路徑)並將其命名為 A。現在,我創建一個指向名為 S 的目錄 A 的符號連結。我們現在應該有:

S -> A

如果我有另一個目錄,讓我們說 B 並按照以下方式做一些事情:

cp -r B/ A/

符號連結會持續存在,還是會破壞它?假設我沒有使用 bash 命令,而是使用 python distutils.dir_utils.copytree(B, A),符號連結 S 是否仍指向 A?A還是A還是變成了B?

您可以很容易地從命令行對此進行測試:

# 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

引用自:https://unix.stackexchange.com/questions/537109