如果电视中断,会发生什么?


72

如果Linux mv命令被中断会怎样?说,我正在将整个目录移动到其他位置,并在移动时中断它。源目录仍会保持不变吗?

Answers:


51

如果在同一文件系统上移动目录,则只能将目录条目从文件系统中的一个位置移动到另一位置。例如,mv /source/dir /target/dir将删除的目录条目dir/source并创建一个新的/target。这是通过一个原子系统调用(即不间断的)完成的。包含目录条目及其目录dir实际内容的索引节点不受影响。

如果将目录从一个文件系统移动到另一个文件系统,则首先将所有文件复制到新文件系统,然后再与原始文件系统取消链接。因此,如果mv在复制时中断,则可能会得到一些文件的两个副本-在旧位置和新位置。


6
@韦斯利:不,不会有部分文件。如果系统保持启动状态(例如,您按ctrl-C),它将自动删除。如果没有(例如,断电),部分文件可能会留在目标磁盘上无法访问的某个位置,但应由下一个清理fsck(由于未彻底卸载磁盘,因此该文件很可能会在重新启动时自动运行)。
Dave Sherohman 2011年

50
错误。如果您将dir从一个fs移到另一个mv / fs1 / dir / fs2 /并中断,则/ fs1 / dir /将完全留在这里。/ fs1 / dir仅在移动完成后才删除。

8
user263131是正确的。运行strace mv /fs1/dir /fs2/-在最后一件事 MV确实是调用unlinkat(一个,因为他们被复制而不是一个)上的所有源文件一次。
雅各布2014年

7
@JJ看起来像是因为您使用了bash扩展,在这种情况下,mv将扩展中的每个文件视为一个单独的源(因此将它们单独处理)。
gkanwar

5
所以.... @ bmk或其他人,您是否想将此答案更新得更少...错误?
Artem Russakovskii

35

GNU实现在命令行上的参数上进行迭代,尝试首先重命名,如果失败,则递归复制,然后递归删除源。所以

mv a b c/

将删除一个复制之前b,并且不会开始删除任何一个之前目的地复制完成。

请注意,这仅适用于GNU实现。

需要说明如果a是包含de的目录,并且b是文件,则顺序为

  • 创建c / a
  • 复制a / d-> c / a / d
  • 复制a / e-> c / a / e
  • 删除A / D
  • 删除一个/一个
  • 删除一个
  • 复制b-> c / b
  • 删除b

1
您可以为此提供资料吗?其他答复者说,将源文件复制到其他fs之后即会立即将其删除(即,不是全部复制,而是全部删除)。
jamesbtate

1
经验。我添加了一个示例,以使我的答案和其他答案的一致性更加清晰。如果仅列出单个文件,那么实际上每个文件都会立即删除。
Simon Richter

我在macOS上观察到了此答案中描述的行为,也就是使用了BSD mv,因此它不仅限于GNU。
kirelagin

12

您移动一个目录,中断移动,原始目录将保持不变:

$ mv a b/

如果您移动多个目录,则每个目录在源或目标上都将保持完整,这取决于您中断的时间:

$ mv a b c/

我如何得到答案:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

作为测试,我将一个大文件夹复制到了NFS目录中,中断了,并且我的源大文件夹中的文件数保持不变,并且部分内容保留在NFS目录中。我使用“查找。-type f | wc -l”进行验证。

看起来西蒙的答案是正确的。


9

公认的答案对于在文件系统之间移动绝对是​​错误的,这一事实已经使我省去了很多麻烦。移动包含子目录的目录时,在复制整个子目录之前,不会删除子目录中的任何文件。这就是“逐个对象”的实际含义-子目录是一个对象(文件),因此在删除任何内容之前,必须通过在目标位置进行完整复制来保留其完整性。因此,西蒙的答案对我来说似乎是正确的答案。



2

绝对没有 此移动是逐个对象进行的。因此,移动到目的地直到中断点的对象将不再在源中存在。

如果mv是针对较大文件(在不同文件之间)发出的,并且已被中断,则源将是完整的。在目标上,您会看到一个不完整的文件,直到中断为止。

但是,您可以使用相同的命令还原mv,该过程将继续。


2

如果由于要断开与终端的连接而要中断mv,则可以将其发送到后台:

* press Ctrl+Z

# bg
# disown

1
那是一个好点,但是它不能回答实际的问题。
Julie Pelletier

1
@JuliePelletier,但这就是我要搜索的内容,因此可能有人对此感兴趣。
КурочкаРяба
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.