![使用单个 tar 调用提取多个 .tar.gz 文件](https://linux22.com/image/2960/%E4%BD%BF%E7%94%A8%E5%8D%95%E4%B8%AA%20tar%20%E8%B0%83%E7%94%A8%E6%8F%90%E5%8F%96%E5%A4%9A%E4%B8%AA%20.tar.gz%20%E6%96%87%E4%BB%B6.png)
我想知道是否(当然,如何)可以告诉tar
在一次运行中提取多个文件。
我是一个有多年经验的 Unix 用户,当然我知道你可以使用for
orfind
或类似的东西来为你想要提取的每个档案调用tar
一次,但我无法想出一个有效的命令行,导致我的tar
一次提取两个 .tar.gz 文件。 (不,没有什么问题for
,我只是问是否可以不用。)
我问这个问题可能是出于好奇
- 有一个奇怪的分支
tar
支持这个 - 有人知道如何使用我尝试时向我建议的
-M
参数tar
tar -zxv -f a.tgz -f b.tgz
- 我们都是盲人,这完全很容易做到——但我在网上找不到任何没有利用
for
或find
或xargs
类似的东西的提示。
请不要回复tar -zxvf *.tar.gz
(因为这会不是工作)并且只有在你绝对确定它(并且可能有一个很好的解释)时才回复“不起作用”为什么, 也)。
编辑:我被指着Stack Overflow 上这个问题的答案其中非常详细地表明,如果不破坏当前语法,这是不可能的tar
,但我认为这不是真的。恕我直言,使用tar -zxv -f a.tgz -f b.tgz
ortar -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