同じファイル システムのディレクトリを移動すると、 ディレクトリ エントリをファイル システム内のある場所から別の場所に移動するだけです。例:mv /source/dir /target/dir
dir
のディレクトリエントリを削除します /source
から /target
で新しいものを作成します .これは、1 つのアトミック システム コール (つまり、割り込み不可) によって行われます。 dir
のディレクトリ エントリを含む inode ディレクトリ自体の実際のコンテンツは影響を受けません。
あるファイル システムから別のファイル システムにディレクトリを移動すると、 すべてのファイルが最初に新しいファイル システムにコピーされ、次に元のファイル システムからリンクが解除されます。 mv
を中断すると コピー中に、古い場所と新しい場所に、一部のファイルの 2 つのコピーが作成される場合があります。
GNU 実装は、コマンド ラインの引数を反復処理し、最初に名前の変更を試みます。それが失敗した場合は、ソースを再帰的にコピーしてから再帰的に削除します。だから
mv a b c/
a を削除します b をコピーする前に 、a の削除を開始しません 宛先コピーが完了する前に.
これは GNU 実装のみに適用されることに注意してください。
明確にするために: もし a d を含むディレクトリです そしてe 、および b はファイルです。順序は次のようになります
- c/a を作成
- a/d をコピー -> c/a/d
- a/e をコピー -> c/a/e
- 削除
- 削除
- 削除
- コピー b -> c/b
- 削除
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」を使用して確認しました。
サイモンの答えは正しいようです。