总是复制和删除比移动更好吗?

Nic*_*ton 18 windows unix file-management

一般来说,当我意识到如果取消文件移动可能会导致目标或源不完整时,我会感到恐慌。此问题适用于基于 Windows 和 Unix 的平台。我永远无法确切地记得在这两种情况下移动命令是如何工作的。例如,如果您要移动目录;它是复制整个目录,然后删除它,还是复制然后单独删除每个文件?

我总是意识到,在键入类似的内容mv verybigdir dest后,我可能应该键入cp -R verybigdir dest  &&  rm -R verybigdir&&只有在第一个命令成功时,操作员才会继续执行下一个命令)——或者这是毫无意义的吗?确切地说,当我在移动中途按Ctrl+时会发生什么C?同样,当我按下取消按钮时,Windows 上究竟发生了什么?

我无法计算我移动某些东西的次数(最后一次是使用svn)并且有两个目录,内容拆分。我想答案很困难,因为并非所有应用程序都以相同的方式移动文件组。

Arj*_*jan 11

即使在永远不会失败的完美稳定的计算机上:如果您关心时间戳,那么mv比普通cp.

cp -a将为您保留时间戳,我假设 Windows 上存在类似的东西)。


小智 10

不。

解释:

mv verybigdir dest
Run Code Online (Sandbox Code Playgroud)

将verybigdir 重命名为dest。这是一个原子操作,即不能中途失败。

如果 dest 在另一台设备上, mv 将先复制,然后删除旧版本。这不是原子操作。如果失败,您可能在 dest 中只有一个非常大的目录的部分副本,但非常大的目录仍然是完整的。

是的,其他应用程序可能会以不同方式移动文件。

  • @rob:不可以。目录与任何其他文件一样,并以相同的方式处理。您正在谈论的行为是通过 `mv verybigdir/* dest` 实现的。 (3认同)
  • 实际上,我认为 Linux 上的 mv 会单独复制/删除每个文件或目录,而不是将整个树复制到目标然后从源中删除整个树……因此,如果中途取消,最终会得到一些两个地方都有文件,而且两个目录都不完整。 (2认同)
  • 基本上,mv 以“cp && rm”的方式处理每个参数……`mv verybigdir/* dest` 将verybigdir 的mv 拆分为许多单独的移动操作。永远记住,与 Windows 不同,Linux 程序/工具不会在那里看到“*”,它是由 shell 扩展的。 (2认同)

小智 10

在 Windows 上,移动到相同的驱动器和分区就像 Unix 的 mv 命令一样,可以重命名文件夹或更改其父文件夹。但是,如果您要将其移动到另一个驱动程序或分区,它将逐个文件复制和删除文件,因此为什么使用 tar 文件或不压缩的 zip 文件在分区和硬盘驱动器之间更快地移动文件会更有效. 如果您要取消它,它只会停在原处。我相信 Unix 也是如此,但我没有对它进行足够的实验来 100% 确定。这只是更改 inode 的问题,但如果它位于另一个分区或驱动器上,则需要将其复制到该分区或驱动器上的扇区。如果你在传输过程中取消它,它已经移动了一些文件,并且正在传输的文件会看到它'

更新:如果您要取消搬家并想恢复搬家,只需重新下达搬家订单即可。它可能会警告您目标文件夹已经存在,但文件不会被覆盖(除非它们在原始移动之前存在,或者被添加到两个移动命令之间),因为一旦它们被传输,它们就会从文件夹中删除。源(如果在不同的分区或驱动器上)。


at.*_*at. 5

在 Windows 上我总是复制和删除而不是移动。我曾经在移动文件时,这是我第一次注意到内存条坏了的地方。移动文件时,它停在中间,我收到一个错误,所以我检查了源文件夹,文件消失了,然后我检查了目标,发现有一个损坏的文件。对于较大的文件,这种情况会更频繁地发生,并且大多数文件都是需要数小时才能下载的,因此建议先复制然后删除。一开始就节省时间,最终会得到回报。