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


16

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

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

但是,编写和调试脚本似乎对于此任务来说是过大的。有没有一种方法或工具已经在本地执行此操作?


8
我感觉到一个xy问题。你为什么需要这个?
henning-恢复莫妮卡

3
@henning有很多可能的原因,所以这是一个很好的问题。例如,一个程序自动尝试处理文件名与某个正则表达式匹配的文件(但由于官僚主义的原因不能暂时禁用)。或者也许是一个备份系统,该系统先获取文件然后存储在持久但只写的介质上。
wizzwizz4

1
@henning我需要它,因为我有许多从几个不同的存储读取的缓存,但是其中一个缓存的容量即将用尽,需要将其从服务中删除。因此,每个文件(如果存在于任何位置)都必须完整且完整。否则,在传输开始和结束之间存在争用条件,缓存可能会抢占(并保留)不完整的文件。
Niels2000 '17

Answers:


27

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

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

将所有内容放在一起,您可以使用类似以下内容的东西:

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

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

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


我认为会有一个很好的工作工具。谢谢!
Niels2000 '17

@ Niels2000我不记得我是否曾经使用过rsync选项,但是您想要的听起来像是rsync可以做的事情,而且我知道它使用临时名称传输文件(除非您使用--inplace),所以我看上去在man rsync发现--remove-source-filesrsync是一个很好的工具,它可以首先检查几乎所有文件传输任务。
cas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.