如何解压缩使用.xz的tarball?


776

我习惯使用带有-xfz标志的tar压缩文件,该标志可以处理gzip和bzip2存档。

最近,我遇到了一个.tar.xz文件,我想使用一步将其解压缩tar,该怎么办?


10
请注意,xz-utils如果尚未安装,则可能需要安装
Tobias Kienzler 2013年

这是我的小脚本,可以为您猜测tar标志:gist.github.com/shime/5908634
shime

2
tar --help列出tar标志。 -xzf适用于gzip-xjfbz2-xJfxz
noobninja

Answers:


1017

Ubuntu包含GNU tar,它可以自己识别格式!根据手册,一个命令可用于任何受支持的压缩方法。

tar xf archive.tar.xz
tar xf archive.tar.gz
tar xf archive.tar

等等。如果tar提供了Cannot exec错误,则可能需要sudo apt install xz-utils先执行。


41
这是GNU tar的功能。我不了解竞争性的实现,但是GNU tar应该与ubuntu最相关。 gnu.org/software/tar/manual/tar.html#SEC131
ramslök

42
如果您遇到tar: xz: Cannot exec: No such file or directory,请安装xz-utilssudo apt-get install xz-utils
Collin Anderson

10
这不是答案,而是“即使您提出要求,您也不关心答案”。为不在“最新”状态的人保留想法
Sean Houlihane 2015年

6
哪个版本的tar不再需要特定标志?
马克·汤姆林

8
@SeanHoulihane,这不是答案,因为OP询问了一个较小的XY问题。ramslök给OP的要求比要求的要好,其中包括有效的“即使您提出要求,您也不关心答案”,这是正确的,因为它是正确的。
Christos Hayward 2015年

331

尝试

tar -xJf file.pkg.tar.xz

-J是,随着.xz文件专门处理的标志。


59
我想知道2020年我们将有多少旗帜。例如... 45种不同的压缩方式?在Linux-fu中,了解tar开关已经是一件黑事。:/
Shiki 2013年

22
@Shiki:这可能就是为什么它不再让您指定压缩格式标志的原因。(请参阅ramslök的答案。)
Nate CK


6
这完全应该是公认的答案,因为它回答了任何版本的tar支持的问题.xz
pospi,2015年

8
在2030年,标志变得完整的图灵... 2040年,标志变得有感觉
user1359

80

如果由于某种原因该tar解决方案不起作用(可能是因为您使用的是OS X内置程序),请尝试以下操作:

unxz < file.tar.xz > file.tar

…相当于:

xz -dc < file.tar.xz > file.tar

然后使用tar解压缩文件。


2
那应该可以用管道构造。
Gerrit

6
我觉得您可以做到unxz < file.tar.xz | tar x或类似。
2014年

7
这对我有用,在哪里tar xf没有。ubuntu 12.04
philshem 2014年

至少在我的Ubuntu计算机上,unxz并不等同于xz -dc,而是xz -d。因此,提取file.tar.xzfile.tar,你只要写unxz file.tar.xz。如果您希望将相当于xz -dc解压缩为stdout,请使用xzcat。例如xzcat file.tar.xz | tar x
nwellnhof '17

30

xz是无损数据压缩器。您将必须从xz提取tar球,然后提取tar:

unxz my_archive.tar.xz      # results in my_archive.tar

然后您知道提取焦油

tar -xf my_archive.tar

资料来源:XZ Utils-Wikipedia


1
最佳答案。xz不需要stdout重定向。甚至更好:unxz -k
Mark Jeronimus

@MarkJeronimus我觉得它不是很好,因为它创建了一个中间文件。使用GNU焦油管道应减少资源需求。
Melebius

15

我遇到了同样的问题,该tar xf命令无法提取它。要解决此问题,您需要安装xz-utils软件包。解决方案是:

sudo apt-get install xz-utils

然后:

tar xf myfile.tar.xz

14
tar -xvf package.tar.xz

-x - 提取文件

-v -详细列出已处理的文件

-f -使用指定的存档文件


5

只是要补充一点,如果当--xz和-J选项可用时,如果您在版本1.22之前具有GNU tar的旧版本,则可以使用压缩或解压缩tar.xz文件--use-compress-program xz。例如,

tar --use-compress-program xz -cf example.tar.xz file1 file2 file3

要么

tar --use-compress-program xz -xf example.tar.xz

4

如果tar识别压缩格式,则不需要标志:

tar xvf *.tar.xz

如果您需要手动解压缩输入,例如由于您的tar太旧而无法识别xz,或者您需要特殊的路径:

xz -cd *.tar.xz | tar xvf -

管道比制作未压缩的中间文件更快,并且使用的磁盘空间也更少!



3

哇,真是个好人。在Mac上使用7zip完成吗?尝试这个:

7z x -so file.tar.xz | tar xf -

需要7z,这不是他想要的-他想完全在tar中完成。
jrg

是的,谢谢-“ xz”救了我!好吧,无论如何,这只是一步:)和tar J= tar xz,所以我们甚至可以写成tar xzf file.tar.xz“ normal” tar xvfz file.tar.gz。所以基本上没有区别。使用开关前无需破折号。

就像问题中给出的答案一样。:)

我也被赶走了,因为tar zxf在.xz文件中出错了,我想一直使用J总是可行的。
Jorge Castro

2
对!手册页与源代码不同步:buffer.c使用-J表示lzma。

3

Ubuntu随附了Python(Python 2.7和Python 3),其中包含提取档案的必要模块。因此,如果由于某种原因tar缺少命令(例如您的系统管理员已将其删除,而您没有sudoprivillege来安装它),则可以使用:

python3 -c 'import tarfile,sys; b = tarfile.open(sys.argv[1]);print(b.extractall())' ./archive.xz 

作为一个简短的脚本,它更具可读性:

#!/usr/bin/env python3
import tarfile,sys

with tarfile.open( sys.argv[1] ) as fd:
    fd.extractall()

假设我使用创建了一个.xz文件tar cJf thing.xz /etc/passwd。存档将包含etc目录,其中包含passwd文件。使用上面的脚本将在etc当前工作目录中创建目录,并且该目录中将包含passwd文件。当然,可以始终通过在extractall()函数内部指定要提取的路径来扩展它。


0

unar 是一个非常不错的简单程序,易于键入,可以取消存档几乎所有格式,包括7z和RAR

它似乎是用(GNU)Objective-C编写的,因此需要安装一些gnustep(GNU的Objective-C实现)库(gnustep-base-runtimelibgnustep-base1.25

如果您使用--install-suggests或已配置apt为安装建议的软件包,unar则会建议并安装许多您不想要的GUI GNUStep程序

sudo apt install --no-install-suggests unar 
unar linux-source.tar.xz

它将自动创建输出目录linux-source

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.