为什么 GNU tar 的 --dereference 选项不会导致它取消引用符号链接?

为什么 GNU tar 的 --dereference 选项不会导致它取消引用符号链接?

我以为我知道 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并没有表明这一点,而只是显示了实际的内部存储。

相关内容