如何防止从tar文件提取命令覆盖的符号链接

时间:2015-03-24 17:24:19

标签: linux bash unix tar centos7

注意:从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

现在创建包含名称为symlink1

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

提取文件夹(symlnk1)中的tar文件正在覆盖符号链接。我想要的只是保留符号链接并复制" iNeedThisfile.txt"

运行此命令后tar -xvf symlink1.tar.gz

symlink1: total 0 -rw-r--r-- 1 root root 0 Mar 24 18:14 iNeedThisfile.txt

提取时的任何标志,在提取时保留符号链接。并将文件复制到符号链接指向的文件夹。

我道歉,因为无法用更少的文字传达我的信息。

2 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。在我的例子中,tar 1.23具有正确的行为(保留了符号链接),而1.26具有" new"行为(删除了符号链接并改为创建目录)。

我发现在-TRTRACT的tar上添加-h标志就可以了。保留符号链接,并将文件添加到它指向的目录中。

例如,我不得不离开     tar zxf foo.tar.gz 至     tar -h -zxf foo.tar.gz

答案 1 :(得分:0)

我正在使用Debian,Brian提供的答案对我不起作用。再次重读OP,我现在意识到OP想要保留目录的符号链接 ,而我想要保留每个单独文件的符号链接 。但是,由于这是我发现的唯一问题,并且已经输入了答案,因此无论如何我都会提供它,以保留每个文件的符号链接。

这就是我找到的解决方案。

首先,我所说的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文件。

任何想要保留每个文件符号链接的人。