为什么mv比cp快得多?如何从错误的mv命令中恢复?


17

我在FileZilla中错误地将文件夹拖放到另一个文件夹中。

~/big_folder
~/some_other_folder

被移动的文件夹非常大。它包含数十万个文件(node_modules,小的图像文件,很多文件夹)

奇怪的是,释放鼠标后,移动完成了。文件夹“ big_folder”被移至“ some_other_folder”。

~/some_other_folder/big_folder

(没有big_folder~/移动之后)

然后我意识到了这个错误,然后尝试移回去,但是在FileZilla和终端上都失败了。

然后,我必须cp -r将文件复制回去,因为有服务器端代码可以访问这些文件~/big_folder

它需要永远的等待...

我该怎么办?

顺便说一句,这是FileZilla的输出(这是后退的失败):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'

37
啊,最有用的错误消息,received failure with description 'Failure'
曼队长

3
转到终端,然后输入命令mv /root/some_other_folder/big_folder /root/big_folder。您得到什么错误信息?
ctrl-alt-delor

我可能会喜欢cp -al
Nemo

1
OP的mv vs cp问题已解决,但是我很想听听他为什么能够立即沿一个方向移动文件夹,而不能沿另一个方向移动文件夹。
user1717828 '18

4
出于同样的原因,将一本书从一个房间移到另一个房间要比创建该书的副本快得多。
David Richerby

Answers:


63

如果一个目录被移动相同的文件系统(在同一个分区)内,则所有需要的是重命名的目录的文件路径。除了目录条目的目录条目之外,没有必要更改任何数据。

复制目录,被复制的每个数据,每个文件的需求。这涉及读取所有源数据并将其写入目标位置。

文件系统之间移动目录将涉及将数据复制到目标并将其从源中删除。这将与在单个文件系统中复制(复制)数据一样长的时间。


如果FileZilla成功将目录从重命名~/big_folder~/some_other_folder/big_folder,那么我将使用恢复该目录

mv ~/some_other_folder/big_folder ~/big_folder

...首先确保没有所谓的目录之后~/big_folder(如果有,此举将使big_foldersome_other_folder进入~/big_folder目录的子文件夹)。


6
哦,这就是为什么我在输出中看到“重新命名”而不是“移动”的原因?
AGamePlayer

2
@AGamePlayer是的,正确。
库萨兰达

4
不幸的是,@ AGamePlayer“失败”不是一个好的错误描述。mv ~/some_other_folder/big_folder ~/确保big_folder主目录中没有其他目录后,我将使用该目录。我从未使用过FileZilla。
库沙兰丹

10
另一个不依赖Windows GUI工具在Unix上进行文件维护的原因。
马克·斯图尔特'18

4
@MarkStewart为什么在您的评论结尾处“在Unix上”?有什么时候是个好主意?
ctrl-alt-delor

11

现有的答案很好,但我想在此基础上进一步扩展一下,确切显示移动与复制文件时发生的情况。在复制过程中查看系统调用时,您会看到:

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

这将打开源文件,然后创建第二个文件。然后,它将源文件的内容读取到内存中,并将该内存写入目标文件。这需要几个上下文切换和一些磁盘I / O,对于大文件来说可能很高。但是,如果移动文件,则会看到:

rename("hello1.txt", "hello2.txt")         = 0

重要的是要记住,只有在文件位于同一物理磁盘上的同一分区上时,您才会看到文件被重命名。如果创建了一个巨大的千兆字节文件,然后将其在家里的两个位置之间移动,您将注意到该操作会立即完成。另一方面,如果将其移动到外部设备,则移动所花费的时间将与使用时一样长cp。这是因为如果文件位于同一分区上,则只能通过重命名来移动文件。


OP移动了目录,而不是文件。
AL

除非OP移动空文件夹,否则它仍然适用,这是唯一不涉及任何文件的情况
glace

@AL在类Unix系统中,所有内容都是文件。
Thegs '18年

@AL文本文件只是一个示例。对于目录,唯一的区别是您会有一些电话,getdents()而且mkdir()电话四处走动。
森林
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.