mvが中断されるとどうなりますか?


72

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

回答:


51

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

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


6
@Wesley:いいえ、部分的なファイルはありません。システムが起動したままの場合(たとえば、ctrl-Cを押すと)、自動的に削除されます。そうでない場合(たとえば、電力損失)、部分ファイルは宛先ディスク上のアクセスできない場所に残っている可能性がありますが、次のディスクでクリーンアップする必要がありますfsck(ディスクがクリーンにアンマウントされなかったため、再起動時に自動的に実行される可能性が高い)。
デイブシェロマン

50
違う。あるfsから別のmv / fs1 / dir / fs2 /にdirを移動して中断すると、/ fs1 / dir /は完全にここにとどまります。/ fs1 / dirは、移動が完了したときにのみ削除されます。

8
user263131は正しいです。実行strace mv /fs1/dir /fs2/- 非常に最後 MVはありませんが呼び出しているunlinkat(彼らがコピーされるように、1つでない1)一度にすべてのソースファイルを上。
ヤコブ14

7
@JJは、bash展開を使用したためです。この場合、mvは展開内の各ファイルを個別のソースとして処理します(したがって、個別に処理します)。
gkanwar

5
だから.... @bmkまたは他の人、あなたはこの答えをより少なくなるように更新しますか...間違っていますか?
アルテムルサコフスキー

35

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

mv a b c/

bをコピーする前にaを削除しコピー先のコピーが完了する前にaの削除を開始しません。

これはGNU実装にのみ適用されることに注意してください。

明確にするには、次の場合には入っているディレクトリであるDEは、およびbはファイルである、順序がなります

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

1
これのソースを提供できますか?他の回答者は、ソースファイルが別のfsにコピーされた直後に削除されると言っています(つまり、すべてがコピーされたのではなく、すべてが削除された)。
ジェームズベート

1
経験。私の回答と他の回答の一貫性をより明確にするために例を追加しました。個々のファイルのみをリストすると、実際には各ファイルがすぐに削除されます。
サイモンリヒター

macOSでこの回答に記載されている動作を観察します。つまり、BSD mvでも同様であるため、GNU専用ではありません。
キレラギン

12

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」を使用して確認しました。

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


9

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



2

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

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

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


2

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

* press Ctrl+Z

# bg
# disown

1
それは良い点ですが、実際の質問には答えません。
ジュリーペレティエ

1
@JuliePelletier、しかしそれは私が探していたものなので、誰かがこれに興味があるかもしれません。
КурочкаРяба
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.