Cp
cp 覆蓋而不覆蓋到目標的硬連結
假設我有以下設置:
$ cat fileA textA $ cat fileB textB $ ln fileA myLink $ cat myLink # as expected textA
我不明白以下行為:
$ cp fileB fileA $ cat myLink # expected ? textB
如果我改為寫作,我會期待這個結果
ln -s fileA myLink
,但不是在這裡。我本來希望
cp
在覆蓋模式下執行以下操作:
- 複製
fileB
硬碟上某處 的內容- 連結
fileA
到那個硬碟地址但相反,我推斷它執行以下操作:
- 按照連結
fileA
- 複製該
fileB
地址的內容似乎沒有同樣的
mv
效果,它按我的預期工作。我的問題:
- 這是我在
man cp
orman mv
or中遺漏的地方解釋了man ln
嗎?- 這種行為只是一個巧合*(比如
fileB
大小不比 大多少fileA
)*,還是可以可靠地用作特徵?- 這不會破壞硬連結的想法嗎?
- 有沒有辦法修改這條線
cp fileB fileA
,以便下一條cat myLink
仍然顯示textA
?
硬連結沒有“跟隨連結” - 創建硬連結只是為同一個文件提供幾個不同的名稱(在低級別,文件實際上是整數 - “inode”,它們的名稱只是為了使用者方便) - 有沒有“原始”和“副本”-它們是相同的。因此,您打開和寫入哪個硬連結是完全一樣的,它們都是一樣的。
因此
cp
,預設情況下會打開一個文件並寫入其中,從而更改文件(以及它擁有的所有名稱)。所以是的,這是意料之中的。現在,如果您(而不是重寫)首先刪除其中一個名稱(從而減少連結數),然後重新創建與您的名稱相同的新文件,您最終會得到兩個不同的文件。這就是cp --remove-destination
會做的。1基礎知識記錄
link(2)
在ln(1)
2是的,這是正常行為,不是僥倖。但見上面關於
cp --remove-destination
3不,不是真的。硬連結只是同一個文件的幾個名稱。您似乎想要的是 COW(寫時複製)連結,它只存在特殊文件系統
4是的,
cp --remove-destination fileB fileA