在写入文件时重命名文件

Lac*_*cey 6 filesystems ext4 ntfs fat

我想知道这是否被认为是安全的。我知道只要链接仍然存在,文件句柄就可以正常工作,并且我知道标识符是 inode 而不是名称,但我不确定它如何在不同的 FS 中工作。

例如,从 ext4 硬盘驱动器复制到 NTFS USB 记忆棒,或从 FAT 记忆棒复制到 ext4 驱动器。

我只是复制了一堆大型媒体文件,并在复制完成之前重命名了它们。校验和匹配。我想知道它是否总是安全的,它会在相反的方向工作,我应该知道哪些怪癖或避免这样做的原因?

操作系统/发行版是带有 5.0.0-15 Linux 内核的 Ubuntu。

Ste*_*itt 5

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

重命名操作本身不会跨不同的文件系统进行操作;从文本编辑器写入文件cp与使用另一个文件系统上的源文件写入文件之间没有区别。

在 Linux 上,rename系统调用对于文件的其他链接是透明的,包括其他硬链接和打开的文件描述(和描述符)。联机帮助页明确指出

oldpath 的打开文件描述符也不受影响。

(我符合“在 Linux 上”的资格只是因为我在 POSIX 中找不到参考;我认为这在 POSIX 风格的操作系统中很常见。)

因此,当您跨文件系统复制文件时,cp打开源进行读取,打开目标进行写入,然后开始复制。重命名操作不会影响它使用的文件描述符;您可以重命名源和/或目标而不影响cp.

另一种思考方式是,其包含目录中的文件名是其目录条目的一部分,指向其 inode;打开的文件描述是指向 inode 的其他指针,其他硬链接也是如此。更改文件名不会影响任何其他现有指针。

需要注意的是,诸如此类的工具mv并不局限于rename系统调用可以做什么;如果你mv跨文件系统文件,rename将会失败(或者mv会发现该操作是跨文件系统的,甚至不会尝试它),然后mv将诉诸手动复制文件内容并删除原始文件。如果被重命名的文件同时被更改,这不会产生好的结果。