如果发生错误,mv会做什么?


18

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

命令很简单mv source-dir destination-dir,两个目录都位于不同的磁盘上。我正在使用mv (GNU coreutils) 7.4。在手册页的任何地方都找不到以下问题的答案:

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

Answers:


8

我认为该info页面的简介可以回答您的所有问题:

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

由于数据已保留,因此恢复不成问题。我不知道它试图成为原子的程度mkdir例如,需要进行源检查)或它是否在其域中(相对于内核),但是如果中断已经发生,而它已经删除了原子,则可能会损坏。资源。到那时,您已经在目标目录中有了一个很好的副本,因此简单的字节大小检查就可以解决问题。

编辑:我对使用创建的巨大文件(几个G)做了一些测试dd,但没有最终结果。从来没有设法仅复制少数几个源—我要么取消了整个操作(太快了),要么后来由于磁盘缓存和良好的文件系统设计而根本没有任何机会(我的^ C总是在成功移动之后着陆) )。


1
关于信息页面,对于每个命令行源目录,如果成功复制了对应的副本,我是否理解正确?我的意思是mv src1 src2 dst,这方面的作品相似mv src1 dst; mv src2 dst并且每个人mv src dst都像cp -a src dst && rm -rf src
maaartinus 2012年

1
我也是这样理解的(只是您的mv是mv && mv)。由于cp -a已经是递归的,因此我怀疑它是否适用于遍历树时发现的单个文件和目录。稍后会做一些测试。
lynxlynxlynx 2012年

12

当mv移动到另一个文件系统时,它首先将所有数据复制到新文件系统。复制新数据后,它将删除旧数据。这意味着,如果移动因失败而中断,则源位置仍应包含所有数据。

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

rsync -av source-dir/ dest-dir/
rm -rf source-dir
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.