it-swarm.cn

通过一个tar调用提取多个.tar.gz文件

我想知道是否有可能(当然还有如何)告诉tar一次运行提取多个文件。

我是一位经验丰富的Unix用户,已有多年的经验,当然我知道您可以使用forfind或类似的方法为每个要提取的档案调用一次tar,但是我无法提供有效的命令行这导致我的tar一次提取两个.tar.gz文件。 (不,for没什么问题,我只是问是否可以不这样做。)

我是出于好奇而问这个问题,也许

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

请不要以tar -zxvf *.tar.gz答复(因为这样做确实无效),如果您的答复是,则仅以“无效”答复对此绝对确定(也许也有很好的解释为什么

编辑:我被指出 关于堆栈溢出的一个问题的答案 它详细地说明了不中断就不可能当前的tar语法,但我认为这不是真的。使用tar -zxv -f a.tgz -f b.tgztar -zxv --all-args-are-archives *.tar.gz不会破坏现有语法,恕我直言。

39
scy

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

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

-i选项在联机帮助页中忽略tar归档文件末尾的EOF=

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

对于*。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
29
Ratnesh

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

避免for循环的一种可能性是安装并激活 [〜#〜] avfs [〜#〜] ,一种 Fuse 文件系统,可提供对以下内容的透明访问档案。每个档案/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
2

find . -name "*.tar.gz" -exec tar xzf {} \;

0
zjengjie