Bash TAR覆盖目录的内容

Bash TAR覆盖目录的内容,bash,shell,unix,tar,Bash,Shell,Unix,Tar,我对tar命令的理解是,如果文件存在,它将覆盖文件的内容。否则它将保持现有状态 [root@something~]# ls -al /etc/init.d/ total XX drwxr-xr-x. 2 root root 83 Jun 14 2018 . drwxr-xr-x. 10 root root 127 Jun 6 2017 .. -rwxr-xr-x. 1 root root 7293 Jan 2 2018 network -rw-r--r--. 1 ro

我对tar命令的理解是,如果文件存在,它将覆盖文件的内容。否则它将保持现有状态

[root@something~]# ls -al /etc/init.d/
total XX
drwxr-xr-x.  2 root root    83 Jun 14  2018 .
drwxr-xr-x. 10 root root   127 Jun  6  2017 ..
-rwxr-xr-x.  1 root root  7293 Jan  2  2018 network
-rw-r--r--.  1 root root  1160 Feb 20  2018 README
[root@something~]# tar tvf /tmp/env_pkg_1.tar 
drwxr-xr-x staff    0 2020-05-29 19:42 etc/
drwxr-xr-x user/staff    0 2020-05-29 18:04 etc/init.d/
-rw-r--r-- user/staff 3383 2020-05-29 18:04 etc/init.d/sshd
[root@something~]# cd /
[root@something /]# tar xf /tmp/env_pkg_1.tar 
[root@something/]# ls -al /etc/init.d/
total 16
drwxr-xr-x   2 XXXXXX XXXXXX 18 May 29 18:04 .
drwxr-xr-x. 85 XXXXXX XXXXXX 8192 May 29 19:42 ..
-rw-r--r--   1 XXXXXX XXXXXX 3383 May 29 18:04 sshd
我不明白为什么tar会替换/etc/init.d的全部内容

有什么意见会有帮助吗

谢谢

我相信/etc/init.d是指向/etc/rc.d/init.d的链接

当您解除对该文件的保护时,它会重写带有目录的链接。您的所有文件仍在/etc/rc.d/init.d中

要修复您的情况,请删除/etc/init.d,重新链接它,并在tar命令中添加一个h:

rm -rf /etc/init.d
cd /etc
ln -s ./rc.d/init.d
cd /
tar xhf /tmp/env_pkg_1.tar
您可以使用-k或-keep旧文件,这样它就不会接触到目标中已经存在的任何文件。根据/etc/init.d/中的输出判断,您希望保留network和README,并在它们旁边提取sshd,因此在您的情况下,它们不会重叠


或者-保留更新的文件将使用tar替换从tar存档中更新的文件,而不是目标上的文件。

您好,有意思的是,您可能在根目录中[root@something/]tar xf当您解除对包的保护时?它将创建相对于当前目录的文件。我已移动到/by cd/。同时更新上面的代码部分。您可以使用-v获得详细的输出,可能会有更多的线索,-keep old files标志将按预期工作,但使用-keep newer files,如果tar文件中的目录比链接新,tar仍将使用目录覆盖现有的softlink init.d->rc.d/init.d。这就是为什么要使用-keep directory symlink。这就是你否决我的原因吗???是的,是的。符号链接就是问题所在。修好它,我就投票!我的tar版本有-dereference或-h。Fedorathis应该是公认的答案,这是唯一的解释,因为tar默认不遵循符号链接