在寫入文件時重新命名文件

在寫入文件時重新命名文件

我想知道這是否被認為是安全的。我知道只要連結保留,文件處理就可以正常工作,我知道標識符是索引節點而不是名稱,但我不確定它如何在不同的文件系統中工作。

例如,從 ext4 硬碟複製到 NTFS USB 記憶棒,或從 FAT 記憶棒複製到 ext4 磁碟機。

我只是複製了一堆大媒體文件,並在複製完成之前重命名了它們。校驗和匹配。我想知道它是否總是安全的,它是否會朝相反的方向起作用,是否有我應該了解的怪癖或避免這樣做的原因?

作業系統/發行版是帶有 5.0.0-15 Linux 核心的 Ubuntu。

答案1

我不確定它在不同的 FS 中如何工作。

重新命名操作本身並不跨不同的檔案系統進行操作;從文字編輯器寫入檔案與使用cp另一個檔案系統上的來源檔案寫入檔案之間沒有區別。

在 Linux 上,rename系統呼叫對於檔案的其他連結是透明的,其中包括其他硬連結和開啟的檔案描述(和描述符)。線上說明頁面明確指出

開啟檔案描述符舊路徑也不受影響。

(我之所以選擇「在 Linux 上」只是因為我在 POSIX 中找不到參考資料;我認為這在 POSIX 風格的作業系統中很常見。)

因此,當您跨檔案系統複製檔案時,cp請開啟讀取來源、寫入目標,然後開始複製。重新命名操作不會影響它正在使用的檔案描述符;您可以重新命名來源和/或目標而不影響cp.

另一種思考方式是,檔案在其包含目錄中的名稱是其目錄項目的一部分,該目錄項目指向其索引節點;開啟檔案描述是指向 inode 的其他指針,其他硬連結也是如此。更改檔案名稱不會影響任何其他現有指標。

需要注意的是,諸如此類的工具mv不會將自己限制為rename系統呼叫可以執行的操作;如果您mv跨檔案系統進行檔案歸檔,rename則會失敗(或mv會發現該操作是跨檔案系統的,甚至不會嘗試),然後mv將採取手動複製檔案內容並刪除原始檔案的方式。如果同時更改正在重新命名的文件,這將不會產生良好的結果。

相關內容