tar
コマンドのマニュアルページには、ハードリンクをたどるオプションがリストされています。
-h, --dereference
follow symlinks; archive and dump the files they point to
--hard-dereference
follow hard links; archive and dump the files they refer to
tar
は、ファイルがハードリンクであることをどのようにして知るのですか?どうやってフォローしますか?
このオプションを選択しないとどうなりますか?どのようにnotハード逆参照ですか?
デフォルトでは、ハードリンクを含むファイルをアーカイブするようにtar
に指示し、そのようなリンクがアーカイブされるファイルに複数含まれている場合、ファイルは1回だけアーカイブされ、2番目(および追加の名前)ハードリンクとして。つまり、そのアーカイブを抽出すると、ハードリンクが復元されます。
--hard-dereference
オプションを使用する場合、tar
はnotを実行してハードリンクを保持します。その代わりに、たまたま同じコンテンツとメタデータを持つ独立したファイルとしてそれらを扱います。アーカイブを抽出すると、ファイルは独立します。
注:ファイルのリンク数を最初にチェックすることにより、ハードリンクを認識します。複数のリンクを持つ各ファイルのデバイス番号と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であることに注意してください。
これらのコマンドはどちらも、stat()
システムコールによって入力されるstruct statのst_nlinkフィールドからリンクカウントを取得するはずです。
私の知る限りでは、tar
を_--hard-dereference
_で実行すると、(上記の例のように)2つの異なるファイル名を持つ単一のファイルを取得する代わりに、それぞれが単一のファイル名を持つ2つのファイルを取得します。 tar
はおそらく各ファイルのリンク数をチェックし、デフォルトでは抽出時に、ハードリンクされたファイルデータ用に2番目のファイル名にハードリンクを作成します。アーカイブの作成時に_--hard-dereference
_で呼び出された場合、tar
の抽出呼び出しが実行されると、2番目のファイル名に対してまったく新しいファイルが作成されるように見えます。