跨文件系统的 mv 是否会在复制和删除之间刷新目标文件系统缓存?

跨文件系统的 mv 是否会在复制和删除之间刷新目标文件系统缓存?

mv被实现为一个简单的rename()只要有可能,只要重命名不起作用,就回退到复制然后删除。在实践中 (但理论上不是),这两种情况分别对应于源和目标位于相同或不同的文件系统上。

我的问题:由 POSIX 标准定义并作为 GNU coreutils 的一部分实现mv,是否保证在后一种情况下(即不可能重命名,回退到复制然后删除),文件系统缓存会被刷新(在某种意义上)sync)在复制和删除操作之间,以便在适当的时候断开目标文件系统不会导致数据丢失?

到目前为止我发现了什么:POSIX 规范mv

任何点的终止都应使 source_file 或目标路径完整

这表明“是”,但我不确定断开文件系统是否会被归类为简单的“终止”,此类语句通常是否仅适用于“表面”文件系统状态,等等。

有一个黑客新闻评论回答“不”,但没有引用任何消息来源。

也许这个问题实际上是不明确的,因为POSIXsync()甚至不保证完成的刷新,只触发它,所以无论如何都没有办法实现跨文件系统的“完全安全”的复制然后删除?

我试图找出它是如何实际实现的GNU coreutils 的mv源代码,但在我再浪费时间之前,为了其他有同样问题的人的利益,我想我也应该在这里问。

相关内容