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

scy*_*scy 46 tar

我想知道是否(当然还有如何)可以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.tgzortar -zxv --all-args-are-archives *.tar.gz不会破坏现有的语法,恕我直言。

pol*_*ial 52

这是可能的,语法很简单:

$ cat *.tar | tar -xvf - -i
Run Code Online (Sandbox Code Playgroud)

-i 选项从手册页忽略 tar 存档末尾的 EOF:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎对我有用。我使用的确切命令是:`cat *.tar.bz2 | 焦油-ixjv`。谢谢! (3认同)
  • <对于tgz> cat *.tgz | tar -xzvf - -i -C /destination/ <or> for file in *.tgz; 做 tar -xzvf $file -C /destination/; 完毕 (2认同)
  • @Rika,“tar -f -”从“stdin”读取,因此需要通过管道传输档案的内容,而不是它们的名称。这就是为什么“ls”不起作用。 (2认同)

小智 34

对于*.tar.gz

for file in *.tar.gz; do tar -zxf "$file"; done
Run Code Online (Sandbox Code Playgroud)

对于*.tar.bz2

for file in *.tar.bz2; do tar -jxf "$file"; done
Run Code Online (Sandbox Code Playgroud)

对于*.tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done
Run Code Online (Sandbox Code Playgroud)

  • 这并没有真正回答是否可以使用一次 tar 调用来提取多个存档的问题。此外,用户表示他们已经熟悉如何使用 for 循环来迭代一组文件。 (5认同)