注意:从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
提取时的任何标志,在提取时保留符号链接。并将文件复制到符号链接指向的文件夹。
我道歉,因为无法用更少的文字传达我的信息。
答案 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
文件。任何想要保留每个文件符号链接的人。