エラーが発生した場合、mvは何をしますか?


18

あるディスクから別のディスクに大きなツリーを移動しようとしましたが、それは小さすぎました。今、私は本当に理解できない何かを残しています-いくつかのファイルがソースツリーから実際に移動された一方で、他のファイルはコピーされたように見えます。これはおそらく真実ではなく、ターゲットディスクの空き場所をチェックしたときのように、何かを見落としているだけです。:D

コマンドは単純mv source-dir destination-dirで、両方のディレクトリが異なるディスクに存在します。を使用していmv (GNU coreutils) 7.4ます。manページのどこにも、次の質問に対する答えが見つかりませんでした。

  • 切り捨てられたファイルが作成される場合がありますか?
  • エラーが発生した場合、ソースツリーの内容は削除されますか?
  • (簡単かつ迅速な方法で)回復する方法?

回答:


8

私はinfoページへのイントロがあなたのすべての質問に答えると思います:

最初に、 `cp -a 'で使用されるのと同じコードのいくつかを使用して、要求されたディレクトリとファイルをコピーし、次に(コピーが成功したと仮定して)オリジナルを削除します。コピーが失敗すると、宛先パーティションにコピーされた部分が削除されます。あるパーティションから別のパーティションに3つのディレクトリをコピーし、最初のディレクトリのコピーが成功したが、2番目のディレクトリがコピーしなかった場合、最初のディレクトリは宛先パーティションに残り、2番目と3番目は元のパーティションに残ります。

データは保存されるため、リカバリは問題になりません。どれだけアトミックにしようとするのか(mkdirたとえば、ソース検査が必要)、またはそれがドメイン内にあるのか(カーネルの場合)はわかりませんが、すでに削除しているときに中断が発生すると破損する可能性がありますソース。その時点で、ターゲットディレクトリに適切なコピーが既にあるので、単純なバイトサイズのチェックでうまくいく可能性があります。

編集:で作成された巨大なファイル(数G)でテストを行いましたがdd、決定的な結果はありませんでした。いくつかのソースのみをコピーすることはできませんでした-私は操作全体をキャンセルしました(速すぎる)か、その後ディスクキャッシュと多分良いファイルシステム設計のためにまったくチャンスを得ませんでした(私の^ Cは常に移動が成功した後に着陸しました)。


1
情報ページに関して、各コマンドラインソースディレクトリについて、対応するコピーが成功した場合に削除されることを正しく理解していますか?私がいることを意味mv src1 src2 dstに似て、この点での作品mv src1 dst; mv src2 dstと各シングルがmv src dst似ていますかcp -a src dst && rm -rf src
-maaartinus

1
それは私もそれを理解する方法です(ちょうどあなたのMVはMVと&MVになります)。以来cp -a、すでに再帰的で、私はそれが木を横断中に見つかった個々のファイルやディレクトリに適用されます疑い。後でいくつかのテストを行います。
lynxlynxlynx

12

mvが別のファイルシステムに移動するとき、最初にすべてのデータを新しいファイルシステムにコピーします。新しいデータがコピーされると、古いデータは削除されます。これは、移動が失敗または中断された場合、ソースの場所にすべてのデータが含まれている必要があることを意味します。

回復する限り、破損するのは宛先データのみです。再度mvを使用する代わりに、rsyncを使用してからrmを手動で使用します

rsync -av source-dir/ dest-dir/
rm -rf source-dir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.