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

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

大きなツリーをあるディスクから別のディスクに移動しようとしましたが、そのディスクは小さすぎました。今、私にはよくわからないことが残っています。一部のファイルは確かにソース ツリーから移動されたようですが、他のファイルは単にコピーされただけです。これはおそらく事実ではなく、ターゲット ディスクの空き領域をチェックしたときのように、私が何かを見落としているだけです。:D

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

  • 切り捨てられたファイルが作成される可能性はありますか?
  • エラーが発生した場合、ソースツリー内の何かが削除されますか?
  • どのように回復しますか(簡単かつ迅速に)?

答え1

mv が別のファイルシステムに移動する場合、最初にすべてのデータを新しいファイルシステムにコピーします。新しいデータがコピーされると、古いデータは削除されます。つまり、移動が中断されたり失敗したりした場合でも、ソースの場所にはまだすべてのデータが含まれているはずです。

回復に関しては、破損しているのは宛先データのみであるはずです。mvを再度使用する代わりに、rsyncを使用してからrmを手動で使用してください。

rsync -av source-dir/ dest-dir/
rm -rf source-dir

答え2

このページの紹介文であなたの質問の全てが答えられると思いますinfo:

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

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

編集: で作成した巨大なファイル (数 G) でテストしてみましたddが、決定的な結果は得られませんでした。ソースの一部しかコピーできませんでした。操作全体をキャンセルしたか (速すぎたため)、その後、ディスク キャッシュとおそらく適切なファイル システム設計 (移動が成功した後、常に ^C がヒットした) により、まったくチャンスがなかったかのどちらかです。

関連情報