首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tar能否将b.tar附加到a.tar中,其中a.tar是从stdin中提取的?

tar能否将b.tar附加到a.tar中,其中a.tar是从stdin中提取的?
EN

Stack Overflow用户
提问于 2012-12-18 13:38:42
回答 1查看 265关注 0票数 5

这是一个git存档-所有风格的脚本的一部分,它将从一个git项目及其所有子模块生成一个tarball。

子模块档案必须单独生成,并附加到超级项目的存档中。但是我想把它们附加到超级工程档案中,比如:

代码语言:javascript
复制
git archive --format=tar ... > super.tar
# pseudo git foreach submodule ; do
  (cd $submodule && git archive --format=tar ...) | tar -Af super.tar
# done

但super.tar是未经修改的。tar -Af super.tar -是无效的。

我可以分两个阶段来做,但我希望我只是愚蠢,不知道该怎么做。

以下是分两个步骤完成的:

代码语言:javascript
复制
git archive --format=tar ... > super.tar
# pseudo git foreach submodule ; do
  (cd $submodule && git archive --format=tar ...) > $submodule.tar
  tar -Af super.tar $submodule.tar && rm -f $submodule.tar
# done
EN

回答 1

Stack Overflow用户

发布于 2022-04-04 21:52:11

tar是令人惊讶的挑剔的管道,因为某些原因!我尝试了各种替代方案(见下文),并检查了手册中的所有选项,并得出结论认为,使用GNU 1.34是不可能的。

在确定了这一点之后,还有其他的选择,例如bsdtar,它可以很好地处理管道和stdin/stdout。但是语法有一点不同。您可以使用--append,默认情况下,它会将整个存档添加到现有存档中。要只将给定存档中的文件添加到结果存档中,需要使用一个特殊的@前缀,请参考手册。这个例子适用于我:

代码语言:javascript
复制
sudo apt install libarchive-tools  # package was named bsdtar previously
bsdtar --version
# bsdtar 3.4.3 - libarchive 3.4.3 zlib/1.2.11 liblzma/5.2.5
# bz2lib/1.0.8 liblz4/1.9.3 libzstd/1.4.8
echo foo > bar
# --no-fflags is to avoid the harmless "unknown extended header
# keyword 'SCHILY.fflags'" warning when extracting with GNU tar.
# I also force it to produce ustar because that is what GNU tar
# creates by default afaik.
bsdtar --format=ustar --no-fflags --create --file result.tar bar
tar tvlf result.tar
# -rwx------ user/group   4 2022-04-04 23:29 bar
echo bar > foo
echo argh > oof

上面设置了所有这些以获得一个工作示例,这是您想要的主要命令行:

代码语言:javascript
复制
tar -cf /dev/stdout foo oof |
    bsdtar --format=ustar --no-fflags --append --file result.tar @-
tar tvlf result.tar
# -rwx------ user/group   4 2022-04-04 23:29 bar
# -rwx------ user/group   4 2022-04-04 23:40 foo
# -rwx------ user/group   5 2022-04-04 23:40 oof

这里是我尝试过的死胡同,如果直接管道不工作并且-不被接受的话,它们可能会显示出一些替代方案。

不使用-作为输入,您可以尝试使用<( ... )进行进程替换。因为我不想使用git archive,所以我不得不强制tar压缩到stdout,以创建一些附加在动态中的替代输入。但是,使用--file -只提供:

代码语言:javascript
复制
tar: Refusing to write archive contents to terminal

因此,我不得不欺骗tar使用--file /dev/stdout。不幸的是,即使是这样:

代码语言:javascript
复制
tar -Af super.tar <( tar -cf /dev/stdout foo )

打印没有警告,只留下super.tar不动。从stdin读取而不是使用FIFO文件具有相同的结果:

代码语言:javascript
复制
git archive | tar -Af super.tar /dev/stdin
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13934254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档