将 tarball 提取到目标目录而不覆盖现有文件

将 tarball 提取到目标目录而不覆盖现有文件

我正在尝试提取压缩包具有这种内部结构(简化)

[edit: added toplevel dir]

some_tarball.tar
└── some_tarball/
    ├── bin/
    │   ├── a
    │   └── b
    └── share/
        └── man/
            └── man1/
                ├── a.1.gz
                └── b.1.gz

为了将其安装到/bin/share目录,我使用了命令sudo tar xzf some_tarball.tar --strip-components 1 -C /

但是,这最终会用其内容覆盖整个目录(即/bin仅包含ab之后),而不是将内容合并在一起。在里面覆盖控制的部分tar manpage,它似乎只是关于覆盖现有文件和元数据dirs,但事实并非如此。

有什么方法可以在这里做出类似tar演示rsync的行为吗?提前致谢!

PS:如果这很重要的话,My/share是 的符号链接/usr/share

答案1

如果最初/bin是符号链接,那么您使用的命令将删除符号链接并在其位置创建一个新目录。

阅读更多内容手动的(强调我的):

从存档中读取时,--dereference( -h) 选项会导致在写入或读取存档中指定的文件tar时遵循已存在的符号链接。tar通常,tar不会点击这样的链接,尽管它可能会在写入新文件之前删除该链接。 […]

--dereference选项不安全[...]

注意一目录也是一个文件

您既没有使用--dereference也没有-h删除链接可能就是发生的情况。

链接指向的目录仍然是某处,其内容未被删除。尽管如此,由于工具/bin非常重要,您的操作系统可能会瘫痪。要解决此问题,您需要重新创建原始链接:删除新/bin目录并使用ln -s target /bin.

不幸的是,我无法说出链接的目标是什么,您需要猜测或找出target应该是什么。或许 /usr/bin

与 类似/share

如果您仍然登录或者可以重新登录,那么修复在技术上应该是可行的,因为您需要的所有工具都应该在某个地方。如果您失去了访问权限(例如,您无法登录,因为/bin/bash您的登录 shell 不存在),则可以选择启动实时发行版并从那里进行修复。

相关内容