`mv` を使用してハードリンクされたファイルをファイルシステム間で移動すると何が起こりますか?

`mv` を使用してハードリンクされたファイルをファイルシステム間で移動すると何が起こりますか?

1 つのファイル システム上に、ハードリンクされたフォルダーのコレクションがあります (内容は同一です)。

フォルダーの 1 つを別のディスク上の別のファイルシステムに移動するとどうなりますか?

私は Mac OSX snow leopard を使用しており、コマンド ラインmvコマンドを使用しています。

答え1

いいえ、デフォルトmvではないハードリンクを保持:

~$ どのmv
バイナリ
~$ uname -a
Darwin mini.local 13.4.0 Darwin カーネル バージョン 13.4.0: 2014 年 8 月 17 日日曜日 19:50:11 PDT; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64

~$ cd /Volumes/Backup\ primary/
バックアッププライマリ$ mkdirテスト
バックアッププライマリ$ cd test/
テスト$エコーfoo>a
テスト$ ln ab
テスト$ ls -li ab
14271856 -rw-r--r-- 2 ユーザー スタッフ 4 10月15日 19:23 a
14271856 -rw-r--r-- 2 ユーザー スタッフ 4 10月15日 19:23 b
テスト$ cd ..
プライマリのバックアップ$ mv test ../Backup\ secondary/
プライマリのバックアップ$ ls -li ../Backup\ secondary/test/
合計 32
11040478 -rw-r--r-- 1 ユーザー スタッフ 4 10月15日 19:23 a
11040479 -rw-r--r-- 1 ユーザー スタッフ 4 10月15日 19:23 b

答え2

注記

1 つのファイルシステム上のフォルダがハードリンクされている

通常はUnixディレクトリ間のハードリンクはサポートされていません「あるディレクトリ内のファイルは、別のディレクトリ内のファイルへのハードリンクである」という意味だと思います。


mv行動

相互にハードリンクされたファイル、つまりファイルシステム内に一度保存された同じデータにつながるパスが多数あるとします。

比較するこのUnix & Linux SEの回答該当部分:

ファイルシステム間の移動 (同じ物理メディア上にあるかどうかは関係ありません) は、ファイルのコピーとそれに続く削除として処理されます。これは、実際にコマンドがmv行うこととまったく同じです。明らかに、宛先のファイルシステムはファイルの新しいコピーを作成する必要があることを意味します。

コピーが作成された後、mvと同様にソースを削除しますrmこれ適用:

rm単にポインタを削除します。ファイルへのポインタ (ハード リンク) が複数ある場合は、そのうちの 1 つのポインタを削除しても、rm他のポインタはまったく変更されず、データは引き続き使用できます。

したがって、ハードリンクされたファイルのいくつかを別のファイルシステムに移動すると、他のハードリンクは安全ですハードリンクはファイルシステムをまたぐことはできないため、新しいコピーはソースファイルシステムに残っているものへのハードリンクにはなりません。

ハードリンクされたファイルをすべて移動すると、それらはすべてソースファイルシステムから消え、ターゲットファイルシステムに表示されます。1つのファイルmv(複数のファイルを移動)でも、新しいファイルは個別に作成されることに注意してください。もはやハードリンクは互いにリンクされている必要があります。理論的には、mvハードリンクを検出してターゲットファイルシステムに再作成するための追加作業を実行できますが、実際にはそうではありません(これは別の答えです)。


ハードリンクを移動してハードリンクを取得する

ハードリンクを再作成するツールは他にもあります。そのうちの 1 つが です (ただし、 Mac OS X でそれが確実に機能するtarかどうかはわかりません)。比較tarこれ:

デフォルトでは、ハード リンクを含むファイルをアーカイブするように指示しtar、アーカイブするファイルの中にそのようなリンクが複数含まれている場合、ファイルは 1 回だけアーカイブされ、2 番目のリンク (および追加の名前) がハード リンクとして記録されます。つまり、そのアーカイブを抽出すると、ハード リンクが復元されます。

復元されたファイル間のハードリンクは復元されます (つまり、ソースのハードリンク接続を模倣します) が、復元されたファイルは、取得元と同じファイルシステムに抽出された場合でも、ソース ファイル (またはまだ存在する可能性のあるハードリンク) に再度ハードリンクされることはありませんtar

tar大きなアーカイブを作成せずにを利用するには、いくつかのシェル トリックが必要です。例:

tar -c /source/dirA/ /source/file1  | { cd /foo/destination/ && tar -x; }

このコマンドは削除せずにコピーを実行します。ソースを削除する必要がある場合は、最終的に別のコマンドで実行します。

関連情報