跨文件系统的近似原子移动?

跨文件系统的近似原子移动?

我必须在 Ubuntu 下将一些文件从一个文件系统移动到另一个文件系统。但是,非常重要的是,文件决不能在目标位置以部分或不完整的文件形式存在,至少不能以正确的文件名存在。

到目前为止,我唯一的解决方案是编写一个脚本,获取每个文件,将其复制到目的地的临时名称,然后在目的地将其重命名(我认为应该是原子的)到原始文件名,最后删除原始文件。

然而,编写和调试脚本对于这项任务来说似乎有些过分了。有没有一种方法或工具已经可以在本地执行此操作?

答案1

rsync复制到临时文件名(例如,参见Rsync 临时文件扩展名rsync - 它在传输过程中是否创建临时文件?) 除非您使用该--inplace选项。仅在文件成功传输后才重命名它们。 rsync还删除仅部分传输的任何目标文件(例如由于磁盘已满或其他错误)。

还有一个--remove-source-files选项可以在成功传输源文件后将其删除。rsync有关更多详细信息,请参阅手册页。

将所有这些放在一起,您可以使用以下内容:

rsync -ax --remove-source-files source/ target/

此选项对于将文件移出“传入”队列或类似将要处理的目录的任务特别有用。

或者,如果这是一次性镜子,则可以rsync不使用该--remove-source-files选项而直接使用。如果您愿意/需要,您可以稍后删除源文件。

相关内容