web-dev-qa-db-ja.com

なぜmvはcpよりもはるかに速いのですか?不正なmvコマンドから回復するにはどうすればよいですか?

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'
17
AGamePlayer

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

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

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


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ディレクトリに移動されます) 。

64
Kusalananda

既存の答えは素晴らしいですが、ファイルを移動するときとコピーするときの違いを正確に示すことで、少し詳しく説明したいと思います。コピー中にsyscallsを見ると、次のことがわかります。

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を使用した場合と同じように移動に時間がかかります。これは、同じパーティションにあるファイルの名前を変更することによってのみファイルを移動できるためです。

12
forest