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

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

无论我使用的是 Windows 还是 Unix 系统,当我考虑取消文件移动时,我经常会担心数据不完整。有时我很难回忆起移动命令在这些环境中是如何工作的,尤其是对于目录。例如:它是在删除原始目录之前复制整个目录,还是一次处理一个文件,然后按顺序复制然后删除它们?

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

我已经数不清有多少次移动过某些东西(最后一次是使用时svn),并且有两个目录,内容被拆分。我想答案很难,因为并非所有应用程序移动以同样的方式编辑文件组。

答案1

在 Windows 上,移动到相同的驱动器和分区将与 Unix 的 mv 命令一样,重命名文件夹或更改其父文件夹。但是,如果您要将其移动到另一个驱动器或分区,它将逐个文件复制和删除,因此使用未压缩的 tar 文件或 zip 文件在分区和硬盘之间更快地移动文件更有效。如果您要取消它,它将简单地停止在原处。我相信 Unix 也是如此,但我没有对其进行足够的实验,因此无法 100% 确定。这只是更改 inode 的问题,但如果它在另一个分区或驱动器上,则需要将其复制到该分区或驱动器上的扇区。如果您在传输过程中取消它,它将已经移动了一些文件,并且正在传输的文件将看到其目标文件被删除,源文件被保留(事务已取消,但您的原始文件仍然存在)。

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

答案2

即使在一台绝对稳定、永不出现故障的计算机上:如果您关心时间戳,那么mv也比普通的要好cp

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

答案3

不。

解释:

mv verybigdir dest

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

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

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

答案4

在 unix 上,在移动跨越文件系统边界,mv不复制数据:它只是更新各个目录中的 inode 数据库。这是很多cp比大文件更快。

此外,mv跨文件系统边界使用只是默默地调用复制和删除机制。

所以我认为你应该更喜欢mv

相关内容