なぜ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
ニモ

1
OPのmv vs cp質問に対処しますが、なぜ彼はフォルダーを一方向に瞬時に移動できたが、他の方向には移動できなかったのかを聞きたいと思います。
user1717828

4
本のコピーを作成するよりも、ある部屋から別の部屋に本を移動する方がはるかに速いという本質的に同じ理由で。
デビッドリチャービー

回答:


63

ディレクトリが同じファイルシステム(同じパーティション)内で移動される場合、必要なのはディレクトリのファイルパスの名前を変更することだけです。ディレクトリ自体のディレクトリエントリ以外のデータを変更する必要はありません。

ときにコピーするディレクトリを、それぞれ、すべてのファイルのデータを複製する必要があります。これには、すべてのソースデータの読み取りと宛先での書き込みが含まれます。

ファイルシステムでディレクトリを移動するには、データを宛先にコピーし、ソースから削除する必要があります。これには、単一のファイルシステム内のデータをコピー(複製)するのと同じくらい長い時間がかかります。


FileZillaがディレクトリの名前をから~/big_folderに正常に変更した場合~/some_other_folder/big_folder、それを使用して元に戻します

mv ~/some_other_folder/big_folder ~/big_folder

...と呼ばれる何のディレクトリがなかったことを確認して最初に行った後に~/big_folder(があった場合、移動が入れてしまうでしょうbig_folderからsome_other_folder~/big_folderサブフォルダとしてディレクトリ)。


6
ああ...だからこそ、出力に「移動する」のではなく「名前を変更する」という言葉が表示されるのですか?
AGamePlayer

2
@AGamePlayerはい、正しいです。
クサラナナンダ

4
@AGamePlayer "Failure"は、残念ながら良いエラーの説明ではありません。ホームディレクトリにmv ~/some_other_folder/big_folder ~/他のユーザーがいないことを確認してから使用しbig_folderます。FileZillaを使用したことがありません。
クサラナナンダ

10
Unixでファイルのメンテナンスを行うためにWindows GUIツールに依存しないもう1つの理由。
マークスチュワート

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

これにより、ソースファイルが開き、2番目のファイルが作成されます。次に、ソースファイルの内容をメモリに読み取り、そのメモリを宛先ファイルに書き込みます。これには、いくつかのコンテキストスイッチと、大きなファイルに対して非常に高いディスクI / Oが必要です。ただし、ファイルを移動すると、次のように表示されます。

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

同じ物理ディスク上の同じパーティションにある場合にのみファイルの名前が変更されることを覚えておくことが重要です。巨大なマルチギガバイトのファイルを作成し、それを家の2つの場所の間で移動すると、アクションが即座に完了することに気付くでしょう。一方、外部デバイスに移動した場合、cp代わりに使用した場合と同じように移動するのに時間がかかります。これは、ファイルが同じパーティションにある場合、ファイルの名前を変更することによってのみファイルを移動できるためです。


OPはファイルではなくディレクトリを移動しました。
-AL

OPは何のファイルが関与されていない唯一のケースのようになり、空のフォルダを、移動されていない限り、それはまだ、カントーを適用しない
グラッセ

@AL Unixライクシステムでは、すべてがファイルです。
-Thegs

@ALテキストファイルは単なる例です。ディレクトリの場合、唯一の違いは、いくつかのコールgetdents()mkdir()コールが散在することです。
フォレスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.