我正在研究基于Perl的文件同步工具。它将文件下载到临时目录(保证与真实文件位于同一文件系统上),然后将临时文件移动到旧文件系统上,保留权限,所有权和ACL等元数据。我想知道如何在Linux上实现最后一步。
在Mac OS X上,至少在C中,我会使用exchangedata
函数。这需要两个文件名作为参数并交换其内容,使所有元数据(除了mtime)保持不变。它保证操作是原子的 - 所有读者都会看到旧文件或新文件,从不介于两者之间。不幸的是,我认为它不适用于Linux。
我知道rename
以原子方式移动,但它不保留元数据。另一方面,我可以打开文件并使用新文件的内容覆盖数据,这将保留所有元数据,但不会是原子操作。有关解决这个问题的任何建议吗?
答案 0 :(得分:6)
我在这里看到的唯一方法是从您要替换的文件中读取元数据,将其应用于临时文件,然后在旧文件上重命名临时文件。 (rename
显然保留了源文件属性。)
答案 1 :(得分:4)