我以为我知道 GNU tar -h
(又名--dereference
)是如何工作的,但现在我很困惑。
考虑:
$ tree dir/
dir/
├── file
└── link -> file
1 directory, 2 files
如果我添加-h
到我的 tar 命令中,我是否应该得到一个包含两个文件条目的存档,一个 namefile
和一个 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
并没有表明这一点,而只是显示了实际的内部存储。