Filesystems

在寫入文件時重命名文件

  • May 29, 2019

我想知道這是否被認為是安全的。我知道只要連結仍然存在,文件句柄就可以正常工作,並且我知道標識符是 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將訴諸手動複製文件內容並刪除原始文件。如果正在重命名的文件同時被更改,這不會產生好的結果。

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