在写入文件时重命名文件

在写入文件时重命名文件

我想知道这是否被认为是安全的。我知道只要存在链接,文件处理就可以正常工作,并且我知道标识符是索引节点而不是名称,但我不确定它如何在不同的文件系统中工作。

例如,从 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将采取手动复制文件内容并删除原始文件的方式。如果同时更改正在重命名的文件,这将不会产生良好的结果。

相关内容