如果 mv 被中断会发生什么?

deh*_*ann 89 linux mv

如果 Linuxmv命令被中断会发生什么?比如说,我正在将整个目录移动到其他地方,并在移动时中断它。源目录是否仍然保持不变?

小智 68

如果移动同一文件系统上的目录则只会将目录条目从文件系统中的一个位置移动到另一个位置。例如,mv /source/dir /target/dir将删除dirfrom的目录条目/source并在/target. 这是由一个原子系统调用(即,不可中断的)完成的。包含目录条目dir以及目录本身的实际内容的 inode不受影响。

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

  • 错误的。如果您将 dir 从一个 fs 移动到另一个 mv /fs1/dir /fs2/ 并且您中断,则 /fs1/dir/ 将完全留在此处。/fs1/dir 只有在移动完成后才会被删除。 (61认同)
  • user263131 是对的。运行 `strace mv /fs1/dir /fs2/` - **最后一件事** mv 做的是一次对所有源文件调用 `unlinkat`(不是一个一个,因为它们被复制)。 (11认同)
  • @Wesley:不,不会有部分文件。如果系统保持运行(例如,您按 ctrl-C),它将被自动删除。如果不是(例如,断电),部分文件可能会留在目标磁盘上无法访问的某个地方,但应该由下一个 `fsck` 清除(它很可能会在重新启动时自动运行,因为磁盘没有卸载干净)。 (7认同)
  • @JJ 看起来是因为您使用了 bash 扩展,在这种情况下 mv 将扩展中的每个文件视为单独的源(因此单独执行它们)。 (7认同)
  • 所以......@bmk 或其他人,你想更新这个答案以减少......错吗? (6认同)
  • 我是在打断“mv /fs1/*.data /fs2”之后来到这里的。fs1 中完全复制到 fs2 的数据文件被删除,表明它是在 bmk 提到的每个文件的基础上完成的。也许目录是一个特例,因为在它们里面的所有东西都出来之前你不能删除它们。 (3认同)
  • gkanwar 是正确的。当 mv 移动目录时,它必须在内部处理文件列表扫描,当它通过 bash 扩展完成时,它会处理一个列表并一个一个地完成。 (2认同)
  • @ArtemRussakovskii 没有错,只是细微差别。不管你怎么做,你都应该是“安全的”,尽管如果你选择中断 mv,你不会丢失源文件。 (2认同)
  • 它没有细致入微,它明确指出,如果您中断“mv”,则原始位置中将不再有文件,这是错误的。 (2认同)

Sim*_*ter 38

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

mv a b c/
Run Code Online (Sandbox Code Playgroud)

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

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

澄清:如果a是包含de的目录,而b是一个文件,则顺序为

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

  • 经验。我添加了一个示例,以更清楚地表明我的答案和其他答案的一致性。如果您只列出单个文件,那么实际上每个文件都会被立即删除。 (2认同)

use*_*878 12

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

$ mv a b/
Run Code Online (Sandbox Code Playgroud)

如果您移动多个目录,则每个目录在源或目标上都将完好无损,具体取决于您何时中断:

$ mv a b c/
Run Code Online (Sandbox Code Playgroud)

我是如何得到答案的:

$ 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.
Run Code Online (Sandbox Code Playgroud)

作为测试,我复制了一个大文件夹到一个NFS目录,中断,我的源大文件夹中的文件数量保持不变,部分内容留在NFS目录中。我用“find .-type f | wc -l”来验证。

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


小智 9

关于在文件系统之间移动,公认的答案绝对是错误的——这一事实已经为我省去了很多麻烦。移动包含子目录的目录时,在复制整个子目录之前,不会删除子目录中的任何文件。这是,顺便说一句。“逐个对象”的实际含义 - 子目录是一个对象(文件),因此在删除任何内容之前,必须通过目的地的完整副本来保留其完整性。所以西蒙的答案在我看来是正确的。


Кур*_*яба 5

如果你想中断 mv 因为你想与终端断开连接,你可以将它发送到后台:

* press Ctrl+Z

# bg
# disown
Run Code Online (Sandbox Code Playgroud)

  • @JuliePelletier,但这就是我正在寻找的东西,所以有人可能有兴趣这样做。 (4认同)