コマンドのマニュアルページには、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
ファイルがハードリンクかどうかはどうすればわかりますか?どうすればいいですか?フォローするそれ?
このオプションを選択しないとどうなりますか?どうすればいいですか?いいえハード逆参照?
答え1
デフォルトでは、ハードリンクを含むファイルをアーカイブするように要求し、アーカイブするファイルにこれらのリンクがtar
複数含まれている場合は、ファイルを一度だけアーカイブし、2番目(および別の名前)をハードリンクとして記録します。これは、アーカイブを抽出するとハードリンクが復元されることを意味します。
--hard-dereference
このオプションを使用tar
すると、いいえハードリンクを維持してください。代わりに、同じコンテンツとメタデータを持つ別々のファイルとして扱います。アーカイブを抽出すると、ファイルは独立しています。
注:まず、ファイル内のリンク数を確認してハードリンクを識別します。複数のリンクを持つ各ファイルのデバイス番号とinodeを記録し、それを使用して同じファイルが再アーカイブされるタイミングを検出します。 (を使用するときは--hard-dereference
これを行いません。)
答え2
リンク数を使用して、ハードリンクを含むファイルとハードリンクではないファイルを区別できます。コマンドラインからこの情報を取得する方法は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」のみリンク数です。どちらのファイル名も同じ inode 番号 932815 を持ちます。
私は両方のコマンドがシステムコールによって埋められるstruct statのst_nlinkフィールドからリンク数を取得すると確信していますstat()
。
私が知っている限り、tar
withを実行する--hard-dereference
ことは、上記の例のように、2つの異なるファイル名を持つ単一のファイルを取得できませんが、それぞれファイル名を持つ2つのファイルを取得することを意味します. tar
各ファイルのリンク数を確認できます。デフォルトでは、抽出すると、2番目のファイル名にハードリンクされたファイルデータへのハードリンクが作成されます。アーカイブの作成時に呼び出されると、抽出呼び出し--hard-dereference
が実行されたときに2番目のファイル名に対してまったく新しいファイルを生成するように見えますtar
。