使用7-Zip在Windows上一步完成程序解压tar.gz文件

40
问题: 我想一步完成对tar.gz文件的提取。这使得我的问题与此问题几乎相同:tar-gz的Stack Overflow问题
我的问题几乎相同,但并不完全相同,因为我希望在Windows上使用7-Zip命令行(或类似的东西)在.bat文件或Ruby / Perl / Python脚本中完成它。 问题: 这个看似简单的任务证明比第一眼看起来要复杂得多。 有人已经有一个可以完成这个任务的脚本吗?

5个回答

86

虽然这是一个老问题,但我今天还在苦恼,所以我来发表我的看法。 7zip命令行工具“7z.exe”(我已安装v9.22版本)可以将内容写入标准输出并从标准输入读取,因此您可以使用管道来避免中间的tar文件:

7z x "somename.tar.gz" -so | 7z x -aoa -si -ttar -o"somename"

其中:

x     = Extract with full paths command
-so   = write to stdout switch
-si   = read from stdin switch
-aoa  = Overwrite all existing files without prompt.
-ttar = Treat the stdin byte stream as a TAR file
-o    = output directory

请查看安装目录下的帮助文件(7-zip.chm)以获取有关命令行命令和开关的更多信息。

所指出,由@zespri指出,PowerShell将缓冲输入到第二个7z进程,因此如果您的tar文件很大,则可能会消耗大量内存。即:

& 7z x "somename.tar.gz" -so  | & 7z x -aoa -si -ttar -o"somename"

如果您想要从PowerShell执行此操作,可以采用这个SO答案中的解决方法:将命令传递给cmd.exe。
& cmd.exe '/C 7z x "somename.tar.gz" -so | 7z x -aoa -si -ttar -o"somename"'

11
一句建议:如果你在Windows上运行它,而且你的档案很大,请勿在PowerShell下运行 - 它会将整个档案读入内存,而不是逐步处理。请打开命令提示符(cmd prompt)并从那里运行它。 - Andrew Savinykh
这太棒了。(请注意,当我尝试它(v15.12)时,它会在工作目录中创建tar文件,但完成后会将其删除) - Dave
@Dave,这在我的15.11版本中并没有发生。你是直接在cmd提示符下运行还是在使用cmd解决方法的powershell中运行的? - user2856

34
7z e example.tar.gz  && 7z x example.tar

使用&&将两个命令结合在一个步骤中。使用7-Zip便携版(你只需要7z.exe和7z.dll)。


14
这不完全是一个步骤。它仍然首先执行gzip步骤,可能会留下一个非常大的tar文件。 - bug
请参考@senthil在https://dev59.com/FHM_5IYBdhLWcg3wfTI0#12321558中提供的单一便捷解决方案;) - Cutton Eye

13

最近你必须使用bsdtar而不是tar,但这仍然是一个很好的想法,比使用7zip更简单。 - pcnate

8

由于您要求使用7-zip或类似工具,我为您提供了一款专门用于您的用例编写的替代工具。

tartool实用程序是一个免费且开源的工具,使用.NET SharpZipLib库构建。

提取.tar.gz/.tgz文件的示例命令:

C:\>TarTool.exe D:\sample.tar.gz ./

免责声明:本工具的作者为我。

0

正如你所看到的,7-Zip在这方面做得不是很好。自2009年以来,人们一直在要求 tarball原子操作。作为替代,你可以使用 Arc程序。示例命令:

arc unarchive test.tar.gz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接