Cp

cp 覆蓋而不覆蓋到目標的硬連結

  • August 14, 2016

假設我有以下設置:

$ 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在覆蓋模式下執行以下操作:

  1. 複製fileB硬碟上某處 的內容
  2. 連結fileA到那個硬碟地址

但相反,我推斷它執行以下操作:

  1. 按照連結fileA
  2. 複製該fileB地址的內容

似乎沒有同樣的mv效果,它按我的預期工作。

我的問題:

  1. 這是我在man cpor man mvor中遺漏的地方解釋了man ln嗎?
  2. 這種行為只是一個巧合*(比如fileB大小不比 大多少fileA)*,還是可以可靠地用作特徵?
  3. 這不會破壞硬連結的想法嗎?
  4. 有沒有辦法修改這條線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

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