![跨文件系统的 mv 是否会在复制和删除之间刷新目标文件系统缓存?](https://linux22.com/image/210039/%E8%B7%A8%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%9A%84%20mv%20%E6%98%AF%E5%90%A6%E4%BC%9A%E5%9C%A8%E5%A4%8D%E5%88%B6%E5%92%8C%E5%88%A0%E9%99%A4%E4%B9%8B%E9%97%B4%E5%88%B7%E6%96%B0%E7%9B%AE%E6%A0%87%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E7%BC%93%E5%AD%98%EF%BC%9F.png)
mv
被实现为一个简单的rename()
只要有可能,只要重命名不起作用,就回退到复制然后删除。在实践中 (但理论上不是),这两种情况分别对应于源和目标位于相同或不同的文件系统上。
我的问题:由 POSIX 标准定义并作为 GNU coreutils 的一部分实现mv
,是否保证在后一种情况下(即不可能重命名,回退到复制然后删除),文件系统缓存会被刷新(在某种意义上)sync
)在复制和删除操作之间,以便在适当的时候断开目标文件系统不会导致数据丢失?
到目前为止我发现了什么:这POSIX 规范mv
说
任何点的终止都应使 source_file 或目标路径完整
这表明“是”,但我不确定断开文件系统是否会被归类为简单的“终止”,此类语句通常是否仅适用于“表面”文件系统状态,等等。
有一个黑客新闻评论回答“不”,但没有引用任何消息来源。
也许这个问题实际上是不明确的,因为POSIXsync()
甚至不保证完成的刷新,只触发它,所以无论如何都没有办法实现跨文件系统的“完全安全”的复制然后删除?
我试图找出它是如何实际实现的GNU coreutils 的mv
源代码,但在我再浪费时间之前,为了其他有同样问题的人的利益,我想我也应该在这里问。