mv
被实现为一个简单的rename()
只要有可能,只要重命名不起作用,就回退到复制然后删除。在实践中 (但理论上不是),这两种情况分别对应于源和目标位于相同或不同的文件系统上。
我的问题:由 POSIX 标准定义并作为 GNU coreutils 的一部分实现mv
,是否保证在后一种情况下(即不可能重命名,回退到复制然后删除),文件系统缓存会被刷新(在某种意义上)sync
)在复制和删除操作之间,以便在适当的时候断开目标文件系统不会导致数据丢失?
到目前为止我发现了什么:这POSIX 规范mv
说
任何点的终止都应使 source_file 或目标路径完整
这表明“是”,但我不确定断开文件系统是否会被归类为简单的“终止”,此类语句通常是否仅适用于“表面”文件系统状态,等等。
有一个黑客新闻评论回答“不”,但没有引用任何消息来源。
也许这个问题实际上是不明确的,因为POSIXsync()
甚至不保证完成的刷新,只触发它,所以无论如何都没有办法实现跨文件系统的“完全安全”的复制然后删除?
我试图找出它是如何实际实现的GNU coreutils 的mv
源代码,但在我再浪费时间之前,为了其他有同样问题的人的利益,我想我也应该在这里问。