web-dev-qa-db-ja.com

mvが中断された場合はどうなりますか?

Linuxのmvコマンドが中断されるとどうなりますか?たとえば、ディレクトリ全体を別の場所に移動し、移動中に中断します。ソースディレクトリは変更されませんか?

75
dehmann

同じファイルシステム上のディレクトリを移動する場合、ディレクトリエントリをファイルシステム内のある場所から別の場所に移動するだけです。たとえば、mv /source/dir /target/dirdirのディレクトリエントリを/sourceから削除し、/targetに新しいエントリを作成します。これは、1つのアトミックシステムコール(つまり、中断なし)によって行われます。 dirのディレクトリエントリを含むiノード、およびディレクトリ自体の実際のコンテンツは影響を受けません。

あるファイルシステムから別のファイルシステムにディレクトリを移動すると最初にすべてのファイルが新しいファイルシステムにコピーされ、次に元のファイルシステムからリンク解除されます。したがって、コピー中にmvを中断すると、一部のファイルのコピーが古い場所と新しい場所の2つになってしまう可能性があります。

56
bmk

GNU実装は、コマンドラインの引数を反復処理し、最初に名前の変更を試み、失敗した場合は再帰的にコピーしてから、ソースを再帰的に削除します。したがって、

mv a b c/

aを削除してからコピーbを削除し、コピー先のコピーが完了する前にaを削除しません。

これはGNU実装のみに適用されます。

明確にするために:adおよびeおよびbを含むディレクトリの場合ファイルです。注文は

  • c/aを作成する
  • a/d-> c/a/dをコピー
  • a/e-> c/a/eをコピー
  • a/dを削除する
  • a/eを削除する
  • 削除する
  • コピーb-> c/b
  • bを削除
36
Simon Richter

1つのディレクトリを移動し、移動を中断すると、元のディレクトリはそのまま残ります。

$ mv a b/

複数のディレクトリを移動すると、中断したタイミングに応じて、それぞれが移動元または移動先でそのまま残ります。

$ mv a b c/

どのように私は私の答えを得ました:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

テストとして、大きなフォルダーをNFSディレクトリーにコピーして中断しましたが、ソースの大きなフォルダー内のファイル数は同じままで、部分的な内容がNFSディレクトリーに残っていました。 「find。-type f | wc -l」を使用して確認しました。

サイモンの答えは正しいようです。

12
user79878

受け入れられた答えは、ファイルシステム間を移動することについては間違いで間違いです。これにより、すでに数回、多くの問題を解決できました。サブディレクトリを含むディレクトリを移動する場合、サブディレクトリ全体がコピーされるまで、サブディレクトリ内のファイルは削除されません。これは、「オブジェクトごと」の実際の意味です-サブディレクトリISオブジェクト(ファイル)であり、したがって、その整合性は、何でもする前に宛先で完全なコピーによって保持する必要がありますサイモンの答えは正しいものとして私に表示されます。

9
bhak

いいえ。mvはオブジェクトごとに動作するため、すでに処理されたオブジェクトはソースから削除されます。

端末から切断したいためにmvを中断したい場合は、バックグラウンドに送信するだけです。

* press Ctrl+Z

# bg
# disown

間違いなく。移動はオ​​ブジェクトごとに行われます。したがって、割り込みポイントまで移動先に移動したオブジェクトは、移動元に存在しなくなります。

大きなファイル(異なるファイル間)に対してmvが発行され、それが中断された場合、ソースはそのまま残ります。ターゲットでは、中断の時点までの不完全なファイルが表示されます。

ただし、同じコマンドでmvを復元でき、プロセスは続行されます。

3
g24l