如何防止tar提取时覆盖符号链接目录

7
注意:从tar版本1.27或更高版本开始,符号链接将被覆盖。
接下来我要说明问题的具体内容。
dirtmp1的内容:
file1.txt
file2.txt

创建上述目录的代码

rm -f -r dirtmp1 && mkdir dirtmp1 && cd dirtmp1 && touch file1.txt && touch file2.txt && ls -al

创建符号链接。
cd ..
ln -s dirtmp1/ symlink1

现在创建一个tar文件,其名称包含symlink1

mkdir dirtmp1
cd dirtmp1
mkdir symlink1 && cd symlink1 && touch iNeedThisfile.txt && cd .. && tar -cvzf symlink1.tar.gz symlink1/

提取tar文件夹(symlnk1)会覆盖符号链接。我想要的只是保留符号链接并复制“iNeedThisfile.txt”。
运行以下命令后:tar -xvf symlink1.tar.gz symlink1: total 0 -rw-r--r-- 1 root root 0 Mar 24 18:14 iNeedThisfile.txt 提取时需要保留符号链接的标志,并将文件复制到符号链接指向的文件夹中。
很抱歉我没有能够用更少的文字传达我的信息。

你确定这不起作用吗?在我的CentOS 5机器上,这个是有效的。 - Etan Reisner
你想从tar文件中提取一个文件吗? tar -xvf {symlink1.tar.gz} {path/to/file} - Soheil Hashemi
@Etan Reisner,不好意思,在CentOS 7上它无法工作,tar版本为1.26。 - forum.test17
为什么您要将tar提取到另一个不存在符号链接文件的路径? - Soheil Hashemi
@Hidd3n 这可能是个问题,但我想在同一个位置提取,而且这在 tar 版本 1.20 中可以工作,但在 tar 版本 1.27 中不再可行。 - forum.test17
显示剩余5条评论
3个回答

15

我遇到了同样的问题。在我的情况下,tar 1.23 表现正常(保留符号链接),而 1.26 表现为“新”行为(删除符号链接并创建目录)。

我发现,在 EXTRACT 上添加 -h 标志可以解决问题。符号链接得以保留,并将文件添加到其指向的目录中。

例如,我需要执行以下操作:

tar zxf foo.tar.gz

tar -h -zxf foo.tar.gz

@Brain 非常感谢您的回复,我已经阅读了文档但是错过了这个-h标志。我会尝试一下 :) - forum.test17
2
在tar版本1.26中,对我来说添加-h标志没有起作用。Centos 7。提取内容会删除符号链接 :( - forum.test17
适用于REHL 7。那个破玩意让我烦恼了两天。+1 - Stelios Adamantidis
1
我不知道它适用于哪个操作系统,但我和@forum.test17一样——它在我的Debian上正在运行的tar 1.30+dfsg-6中无法正常工作。使用tar -h -zxf提取内容也会为我删除符号链接。 - xpt

0

对我有用的是 --keep-directory-symlink。(我认为 -h 只适用于创建 tar 文件。)

这个选项已经在 Gnu tar 中存在了将近10年,但我认为 Ubuntu 只在20.04/focal中开始暴露它(18.04手册页没有提到该选项)。

顺便说一下:对我来说真的很奇怪的是,只有在我通过SSH远程运行命令时才需要使用--keep-directory-symlink(例如:ssh [host] "tar xzvf tarball-with-unsymlinked-directory-paths.tgz")。当我在同一台机器上直接在本地交互式登录会话中提取相同的tarball时,我不需要--keep-directory-symlink。不知道为什么。(这是在Ubuntu 22.04系统上。)似乎Ubuntu的tar并不完全符合标准的Gnu tar


0

我正在使用Debian,但Brian提供的答案对我无效。重新阅读原帖后,我现在意识到原帖想要保留目录的符号链接,而我想要保留每个单独文件的符号链接。但由于这是我找到的唯一结果,而且我已经输入了我的答案,我仍然会提供它,以保留每个单独文件的符号链接。

所以这是我发现的解决方案。

首先,我正在使用的Debian:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

我的 tar 是 1.30+dfsg-6:

$ apt-cache policy tar
tar:
  Installed: 1.30+dfsg-6
  Candidate: 1.30+dfsg-6
  Version table:
 *** 1.30+dfsg-6 500
        500 http://deb.debian.org/debian buster/main amd64 Packages
        100 /var/lib/dpkg/status

我发现的是,
  • tar -h -xvf symlink1.tar.gz 不起作用。以这种方式提取内容将删除符号链接。tar -h --no-overwrite-dir -xvf symlink1.tar.gz 也不起作用。但是,
  • tar -h --overwrite -xvf symlink1.tar.gz 将起作用!以这种方式提取内容将保留每个单独文件的符号链接,但是,
  • tar -h --overwrite -xvJf symlink1.tar.xz 不起作用。即,对于.tar.gz有效的方法对于.tar.xz文件无效。

希望对想要保留每个单独文件的符号链接的人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接