Mv
如果移動權限被拒絕,為什麼 MV(1) 會複製對象?
是否
mv
表現得cp(1)
好像程序移動的許可被拒絕?如果是這樣,做一件事並做好是不是違反規則?
簡短的回答是它沒有。
執行與
rename()
功能等效的操作
rename()
不複製內容,它只是在磁碟上重命名它。這是一個完全原子操作,永遠不會部分完成。然而,這並不能說明全部。當試圖在設備之間移動文件時會發生這種影響:在這種情況下,不可能在文件系統中進行重命名。要產生移動的效果,
mv
首先將源複製到目標,然後刪除源。實際上,mv /mnt/a/X /mnt/b/Y
本質上等同於cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X
。這是在設備之間移動文件的唯一方法。當
mv
沒有權限刪除那個源文件時,會報錯,但此時已經發生了拷貝。由於在操作期間權限發生變化的可能競爭條件,因此無法通過提前檢查權限來避免這種情況。除了根本無法在設備之間移動文件之外,真的沒有辦法防止這種可能發生的情況。在一般情況下,允許
mv
在任何源和目的地之間進行選擇會使事情變得更簡單,但代價是在這些不尋常的情況下會出現奇怪的(但非破壞性的)行為。這也是為什麼在單個設備中移動大文件比移動到另一個設備要快得多的原因。