我必须在 Ubuntu 下将一些文件从一个文件系统移动到另一个文件系统。但是,非常重要的是,文件决不能在目标位置以部分或不完整的文件形式存在,至少不能以正确的文件名存在。
到目前为止,我唯一的解决方案是编写一个脚本,获取每个文件,将其复制到目的地的临时名称,然后在目的地将其重命名(我认为应该是原子的)到原始文件名,最后删除原始文件。
然而,编写和调试脚本对于这项任务来说似乎有些过分了。有没有一种方法或工具已经可以在本地执行此操作?
答案1
rsync
复制到临时文件名(例如,参见Rsync 临时文件扩展名和rsync - 它在传输过程中是否创建临时文件?) 除非您使用该--inplace
选项。仅在文件成功传输后才重命名它们。 rsync
还删除仅部分传输的任何目标文件(例如由于磁盘已满或其他错误)。
还有一个--remove-source-files
选项可以在成功传输源文件后将其删除。rsync
有关更多详细信息,请参阅手册页。
将所有这些放在一起,您可以使用以下内容:
rsync -ax --remove-source-files source/ target/
此选项对于将文件移出“传入”队列或类似将要处理的目录的任务特别有用。
或者,如果这是一次性镜子,则可以rsync
不使用该--remove-source-files
选项而直接使用。如果您愿意/需要,您可以稍后删除源文件。