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


35

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

我是一名经验丰富的Unix用户,已有多年的经验,当然我知道您可以使用forfind类似方法对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.tgztar -zxv --all-args-are-archives *.tar.gz不会破坏现有语法,恕我直言。


出于好奇,什么情况导致您开始考虑如何避免循环构造?
Unclejamil 2011年

1
仅供参考:GNU tar支持带参数的多卷tar存档-M
史蒂夫·o

1
unclejamil:我正在编写HowTo,其中的步骤之一涉及解压缩几个压缩文件(.tar.bz2,.tar.gz,.zip)。由于这是HowTo,因此我想知道执行此操作的最优雅的命令行是什么。:)
scy

Answers:


38

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

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

-i选项将忽略tar归档文件末尾的EOF,从手册页开始:

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

1
这似乎对我有用。我使用的确切命令是:cat *.tar.bz2 | tar -ixjv。谢谢!
scy

1
<For tgz> cat * .tgz | tar -xzvf--i -C / destination / <or>用于* .tgz中的文件; 做tar -xzvf $ file -C / destination /; 完成
Ferroao

27

为* .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

1
在此处修复格式,这将更易读。
eyoung100

这很棒。格式也很棒,因为那就是它在终端机中的样子
smatthewenglish

1
$file如果文件的名称带有空格,请不要忘记使用引号引起来。
亚历山大·雷沃

这并不能真正回答是否可以通过一次调用tar提取多个存档的问题。此外,用户说他们已经熟悉如何使用for循环遍历一组文件。
库沙兰丹

2

您需要使用循环。这样做不会破坏tar命令行语法以允许多个-f选项,但是会需要添加代码以按各种边缘条件依次处理多个档案(如果中间档案格式错误,会发生什么情况?档案可以使用不同的格式吗?压缩机制?您是否也可以有多个-C选项(提取到特定目录的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

-1

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


这是做什么的?
Pierre.Vriens

1
这就引入了一个隐式循环,它为找到的每个文件调用一次tar,用户表示他们已经知道如何执行此操作。
库沙兰丹

抱歉,我没有仔细阅读问题,我只是在搜索提取多个tar包的方法,请阅读上面的答案,并认为使用查找功能会更容易。
zjengjie
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.