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

Nie*_*000 16 file-copy move

我必须在 Ubuntu 下将一些文件从一个文件系统移动到另一个文件系统。但是,非常重要的是,文件在目的地永远不会作为部分或不完整的文件存在,至少不会以正确的文件名存在。

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

但是,编写和调试脚本对于这项任务来说似乎有点过头了。是否有一种方法或工具可以在本地完成此操作?

cas*_*cas 27

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

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

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

rsync -ax --remove-source-files source/ target/
Run Code Online (Sandbox Code Playgroud)

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

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