在寫入文件時重命名文件
我想知道這是否被認為是安全的。我知道只要連結仍然存在,文件句柄就可以正常工作,並且我知道標識符是 inode 而不是名稱,但我不確定它如何在不同的 FS 中工作。
例如從 ext4 硬碟複製到 NTFS USB 記憶棒,或從 FAT 記憶棒複製到 ext4 驅動器。
我只是在複製一堆大型媒體文件,並在復製完成之前將它們重命名。校驗和匹配。我想知道它是否總是安全的,它會朝相反的方向工作,是否有我應該知道的怪癖或避免這樣做的原因?
OS/Distro 是帶有 5.0.0-15 Linux 核心的 Ubuntu。
我不確定它如何在不同的 FS 中工作。
重命名操作本身不會跨不同的文件系統進行操作;從文本編輯器寫入文件與使用
cp
另一個文件系統上的源文件寫入文件之間沒有區別。在 Linux 上,
rename
系統呼叫對文件的其他連結是透明的,包括其他硬連結和打開的文件描述(和描述符)。手冊頁明確指出oldpath的打開文件描述符也不受影響。
(我有資格使用“在 Linux 上”,只是因為我在 POSIX 中找不到參考;我認為這在 POSIX 風格的作業系統中很常見。)
因此,當您跨文件系統複製文件時,
cp
打開源進行讀取,打開目標進行寫入,然後開始複製。重命名操作不會影響它使用的文件描述符;您可以重命名源和/或目標而不影響cp
.另一種思考方式是,包含目錄中的文件名是其目錄條目的一部分,它指向其 inode;打開文件描述是指向 inode 的其他指針,其他硬連結也是如此。更改文件名不會影響任何其他現有指針。
需要注意的警告是,諸如此類的工具
mv
並不局限於rename
系統呼叫可以做的事情。如果您mv
跨文件系統文件,rename
則會失敗(或者mv
會發現該操作是跨文件系統的,甚至不會嘗試),然後mv
將訴諸手動複製文件內容並刪除原始文件。如果正在重命名的文件同時被更改,這不會產生好的結果。