使用单个 tar 调用提取多个 .tar.gz 文件

使用单个 tar 调用提取多个 .tar.gz 文件

我想知道是否(当然,如何)可以告诉tar在一次运行中提取多个文件。

我是一个有多年经验的 Unix 用户,当然我知道你可以使用fororfind或类似的东西来为你想要提取的每个档案调用tar一次,但我无法想出一个有效的命令行,导致我的tar一次提取两个 .tar.gz 文件。 (不,没有什么问题for,我只是问是否可以不用。)

我问这个问题可能是出于好奇

  • 有一个奇怪的分支tar支持这个
  • 有人知道如何使用我尝试时向我建议的-M参数tartar -zxv -f a.tgz -f b.tgz
  • 我们都是盲人,这完全很容易做到——但我在网上找不到任何没有利用forfindxargs类似的东西的提示。

请不要回复tar -zxvf *.tar.gz(因为这会不是工作)并且只有在你绝对确定它(并且可能有一个很好的解释)时才回复“不起作用”为什么, 也)。

编辑:我被指着Stack Overflow 上这个问题的答案其中非常详细地表明,如果不破坏当前语法,这是不可能的tar,但我认为这不是真的。恕我直言,使用tar -zxv -f a.tgz -f b.tgzortar -zxv --all-args-are-archives *.tar.gz不会破坏现有的语法。

答案1

这是可能的,语法非常简单:

$ cat *.tar | tar -xvf - -i

-i 选项忽略 tar 档案末尾的 EOF,来自手册页:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)

答案2

为了 *.tar.gz:

for file in *.tar.gz; do tar -zxf "$file"; done

为了 *.tar.bz2:

for file in *.tar.bz2; do tar -jxf "$file"; done

为了 *.tar.xz:

for file in *.tar.xz; do tar -Jxf "$file"; done

为了 *.tar.zst 新的

for file in *.tar.zst; do tar --zstf -xf "$file"; done

答案3

您需要使用循环。它不会破坏tar命令行语法以允许多个-f选项,但需要添加代码来按顺序处理多个存档,并具有各种边缘条件(如果中间的存档格式错误会发生什么?存档可以使用不同的存档吗?)压缩机制吗?-C也可以有多个选项(用于提取到特定目录的 GNU tar 选项)吗?-K(用于从某个成员名称开始的 GNU tar 选项)怎么样?

避免循环的一种可能性for是安装并激活AVFS, A保险丝提供对档案的透明访问的文件系统。每个档案都/path/to/archive兼作一个目录~/.avfs/path/to/archive#。如果您想使用通配符来匹配档案,则将其添加#到通配符匹配中存在一个障碍;可以在 zsh 中完成。

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination

相关内容