我正在尝试提取压缩包具有这种内部结构(简化)
[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
仅包含a
和b
之后),而不是将内容合并在一起。在里面覆盖控制的部分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 不存在),则可以选择启动实时发行版并从那里进行修复。