无论我使用的是 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
。