linux - 选择性解压,忽略现有的绝对文件夹结构,tar到一个目录
问题描述
假设example.tar.gz
存档包含以下内容:
volumes/wordpress/a
volumes/wordpress/.b
volumes/wordpress/c/d
volumes/service2/a
volumes/service2/.b
volumes/service3/c/d
volumes/service3/a
volumes/service3/.b
volumes/service3/c/d
我想volumes/wordpress
将存档的内容提取到/var/www/html
主机上的目录(已存在且无法删除),最终得到:
/var/www/html/a
/var/www/html/.b
/var/www/html/c/d
我无法重新格式化 tar 文件。
我试过的:
gunzip -c example.tar.gz | tar -C /var/www/html -xf - volumes/wordpress
但这会产生
/var/www/html/volumes/wordpress/...
gunzip -c example.tar.gz | bash -c 'tar -C /tmp -xf - volumes/wordpress && mv /tmp/volumes/wordpress/* /var/www/html'
但这会跳过
.b
文件gunzip -c example.tar.gz | bash -c 'tar -C /tmp -xf - volumes/wordpress && rsync -a --remove-source-files /tmp/volumes/wordpress/ /var/www/html/'
但 rsync 在 docker 容器的上下文中不存在
请注意,因为我认为这与这个问题无关,所以我跳过了 Docker 相关细节,但如果有用,我正在运行的命令采用以下格式:
gunzip ... | docker-compose run --rm wordpress tar ...
这允许在 docker-compose yml 中定义 wordpress 容器(因此我声明我无法删除/var/www/html/
,因为它是作为卷安装的)
编辑事实证明,我最终找到了一个令人满意的(虽然 hacky)解决方案来解决我的问题,而且它是 Docker 特定的(因此编辑了包含 Docker 标签的问题)。我将提供 hacky 答案作为问题的答案。如果可能的话,仍然对非 Docker 相关的答案感兴趣。
解决方案
我能够将已经定义的(通过 docker-compose.yml)卷重新挂载到 docker my-volume
-compose 运行my-service
,但在这种情况下映射到第二个容器化目录,tar 将在其中输出其内容。
例如
gunzip -c example.tar.gz | docker-compose run --rm -v my-volume:/volumes/wordpress my-service tar -C / -xf - volumes/wordpress
推荐阅读
- python - Django 单选按钮在 mark_safe() 内显示为项目符号列表
- node.js - 在nest.js 中使用带有nestjsx-automapper 的配置文件
- azure-active-directory - 无法生成访问令牌和刷新令牌
- java - 代表Java中的对象的Json数组?
- python - Zappa+Flask:对“/”的 GET 请求产生 502 响应代码
- reactjs - 运行构建过程时如何配置我的 prod 环境变量?
- android - 升级 GStreamer。预期的 NDK STL 共享对象文件
- java - 以编程方式打开设备密码更改android
- mysql - MySQL中同时插入父子表
- ios - NotificationCenter.default.addObserver 没有调用目标 C 函数