如果出现错误,mv 会做什么?

如果出现错误,mv 会做什么?

我刚刚尝试将一棵大树从一个磁盘移动到另一个磁盘,但该磁盘太小了。现在,我留下了一些我无法真正理解的东西 - 看起来有些文件确实已从源代码树中移走,而其他文件只是被复制了。这很可能不是真的,我只是忽略了一些东西,就像我在检查目标磁盘上的空闲空间时所做的那样。 :D

该命令很简单mv source-dir destination-dir,两个目录驻留在不同的磁盘上。我在用着mv (GNU coreutils) 7.4。在手册页中我找不到以下问题的答案:

  • 可能会创建被截断的文件吗?
  • 如果出现错误,源树中的任何内容都会被删除吗?
  • 如何恢复(以简单快速的方式)?

答案1

当 mv 移动到不同的文件系统时,它首先将所有数据复制到新文件系统。一旦新数据被复制,旧数据就会被删除。这意味着如果移动中断或失败,源位置仍应包含所有数据。

至于恢复,只有目标数据应该被损坏。不用再次使用 mv,只需使用 rsync,然后手动 rm

rsync -av source-dir/ dest-dir/
rm -rf source-dir

答案2

我认为该页面的介绍info回答了您所有的问题:

它首先使用“cp -a”使用的一些相同代码来复制请求的目录和文件,然后(假设复制成功)它删除原始文件。如果复制失败,则复制到目标分区的部分将被删除。如果要将三个目录从一个分区复制到另一个分区,并且第一个目录的复制成功,但第二个目录没有成功,则第一个目录将保留在目标分区上,第二个和第三个目录将保留在原始分区上。

恢复应该不成问题,因为数据被保留。我不知道它有多少尝试原子mkdir例如;需要源检查)或者如果它完全在其域中(相对于内核的),但是如果在它已经删除源时发生中断,则可能会出现损坏。此时,您已经在目标目录中拥有了一个良好的副本,因此简单的字节大小检查就可以解决问题。

编辑:我用创建的大文件(几G)进行了一些测试dd,但没有得出结论性的结果。从来没有成功地只复制了一些源代码——我要么取消了整个操作(太快了),要么后来由于磁盘缓存和可能良好的文件系统设计而根本没有机会(我的^C总是在移动成功后落地) )。

相关内容