私はGNU tar -h
(別名)の--dereference
仕組みを知っていると思いましたが、今は混乱しています。
考慮する:
$ tree dir/
dir/
├── file
└── link -> file
1 directory, 2 files
これをtarコマンドに追加すると、-h
2つのファイルエントリを持つアーカイブを取得する必要がありますか? 1つはname file
、もう1つはname、link
それぞれ同じ内容を持っていますか?代わりにfile
期待どおりにアーカイブしましたが、アーカイブのシンボリックリンクエントリはlink
次を指しますfile
。
$ tar cf archive -h dir
$ tar tvf archive
drwxr-xr-x bspencer/bspencer 0 2024-01-12 15:36 dir/
-rw-r--r-- bspencer/bspencer 13 2024-01-12 15:41 dir/file
hrw-r--r-- bspencer/bspencer 0 2024-01-12 15:41 dir/link link to dir/file
-h
このオプションは、アーカイブにシンボリックリンクエントリが生成されるのを防ぎますか?
$ man tar |grep -A1 -- --dereference
-h, --dereference
Follow symlinks; archive and dump the files they point to.
従来の文字の代わりに--dereference
使用する場合など、パラメータに長い名前を使用すると同じ結果が得られます。--create
$ tar --version |head -1
tar (GNU tar) 1.34
答え1
次の出力にもかかわらず、Tarはリンクではなく個々のファイルを含むようにこれらのアーカイブを正しく拡張しますtar tvf
。
$ tree dir
dir
├── file
└── link -> file
1 directory, 2 files
$ tar cf archive -h dir
$ tar tvf archive
drwxr-xr-x bspencer/bspencer 0 2024-01-16 12:26 dir/
-rw-r--r-- bspencer/bspencer 9 2024-01-16 12:26 dir/file
hrw-r--r-- bspencer/bspencer 0 2024-01-16 12:26 dir/link link to dir/file
$ mkdir out
$ cd out && tar xvf ../archive
dir/
dir/file
dir/link
$ tree
.
└── dir
├── file
└── link
2 directories, 2 files
$ ls -l dir
total 8
-rw-r--r-- 2 bspencer bspencer 9 Jan 16 12:26 file
-rw-r--r-- 2 bspencer bspencer 9 Jan 16 12:26 link
したがって、tarはうまく動作します。
私はこれがtar tvf
アーカイブの内容を確実に示すだろうと間違って考えました。代わりに、アーカイブが実際の個々のファイルを含むように拡張されていても、「リンク済み」と表示されます。
しかし、tar tvf
出力がリンクについて話す理由についての私の考えは、tarがスペースを節約するためにファイルの内容をリンクとして保存し、拡張時に別々のファイルとして生成されることを示すことです。ただし、何らかの理由でtar tvf
これは表示されず、実際の内部ストレージのみが表示されます。