回答:
同じファイルシステム上のディレクトリを移動する場合、ファイルシステム内のある場所から別の場所にディレクトリエントリを移動するだけです。たとえば、from mv /source/dir /target/dir
のディレクトリエントリを削除し、に新しいエントリを作成します。これは、1つのアトミックシステムコール(つまり、割り込み不可能)によって行われます。のディレクトリエントリを含むiノードと、ディレクトリ自体の実際のコンテンツは影響を受けません。dir
/source
/target
dir
あるファイルシステムから別のファイルシステムにディレクトリを移動すると、まずすべてのファイルが新しいファイルシステムにコピーされ、次に元のファイルシステムからリンク解除されます。そのため、mv
コピー中に中断すると、一部のファイルのコピーが古い場所と新しい場所に2つずつある可能性があります。
strace mv /fs1/dir /fs2/
- 非常に最後 MVはありませんが呼び出しているunlinkat
(彼らがコピーされるように、1つでない1)一度にすべてのソースファイルを上。
GNU実装は、コマンドラインの引数を反復処理し、最初に名前の変更を試み、それが失敗した場合、ソースを再帰的にコピーしてから再帰的に削除します。そう
mv a b c/
bをコピーする前にaを削除し、コピー先のコピーが完了する前にaの削除を開始しません。
これはGNU実装にのみ適用されることに注意してください。
明確にするには、次の場合には入っているディレクトリであるDとEは、およびbはファイルである、順序がなります
mv
でも同様であるため、GNU専用ではありません。
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」を使用して確認しました。
サイモンの答えは正しいようです。
いいえ。mvはオブジェクトごとに動作するため、すでに処理されたオブジェクトはソースから削除されます。
端末から切断するためにmvを中断する場合は、単にバックグラウンドに送信できます。
* press Ctrl+Z
# bg
# disown
fsck
(ディスクがクリーンにアンマウントされなかったため、再起動時に自動的に実行される可能性が高い)。