回答:
デフォルトでは、tar
ハードリンクを含むファイルをアーカイブするように指示し、そのようなリンクがアーカイブするファイルに複数含まれている場合、ファイルを1回だけアーカイブし、2番目(および追加の名前)をハードリンクとして記録します。つまり、そのアーカイブを抽出すると、ハードリンクが復元されます。
この--hard-dereference
オプションを使用する場合、ハードリンクは保持されtar
ません。代わりに、偶然同じコンテンツとメタデータを持つ独立したファイルとしてそれらを扱います。アーカイブを抽出すると、ファイルは独立します。
注:最初にファイルのリンクカウントをチェックすることにより、ハードリンクを認識します。複数のリンクを持つ各ファイルのデバイス番号とiノードを記録し、それを使用して同じファイルが再びアーカイブされていることを検出します。(を使用する場合--hard-dereference
、これは行われません。)
ハードリンクが設定されたファイルと、「リンクカウント」が設定されたハードリンクされていないファイルを区別できます。コマンドラインからこれを取得する方法は2つあります。
% stat original
File: ‘original’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 804h/2052d Inode: 932815 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 500/ bediger) Gid: ( 1000/ bediger)
Access: 2012-07-13 22:13:52.317101530 -0600
Modify: 2012-07-13 22:13:52.317101530 -0600
Change: 2012-07-13 22:14:08.050894536 -0600
Birth: -
または
1010 % ls -li
total 0
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 original
932815 -rw-r--r-- 2 bediger bediger 0 Jul 13 22:13 secondary
「bediger」の前の孤独な「2」がリンク数です。両方のファイル名には同じiノード番号932815があることに注意してください。
これらのコマンドはどちらも、struct statのst_nlinkフィールドからリンクカウントを取得しstat()
ます。これは、システムコールによって入力されます。
私が知る限り、「で実行」tar
と--hard-dereference
は、2つの異なるファイル名を持つ単一のファイルを取得する代わりに(上記の例のように)、それぞれが1つのファイル名を持つ2つのファイルを取得することを意味します。 tar
おそらく各ファイルのリンク数をチェックし、デフォルトでは、抽出時に、ハードリンクされたファイルデータの2番目のファイル名にハードリンクを作成します。--hard-dereference
アーカイブの作成時に呼び出されると、抽出の呼び出しがtar
実行されるときに、2番目のファイル名に対してまったく新しいファイルが作成されるように見えます。