Como descompactar um tarball que usa .xz?


775

Estou acostumado a extrair tarballs com uma -xfzbandeira, que lida com arquivos gzip e bzip2.

Recentemente, encontrei um .tar.xzarquivo e gostaria de descompactá-lo em uma etapa usando tar, como posso fazer isso?


10
Nota Poderá ter de instalar xz-utilsse já não estiver presente
— Tobias KIENZLER

aqui está o meu pequeno script que adivinha bandeiras de alcatrão para você: gist.github.com/shime/5908634
— shime

2
tar --helplista tarbandeiras. -xzfaplica-se a gzip. -xjfpara bz2. -xJfpara xz.
— noobninja

Respostas:


1016

O Ubuntu inclui o GNU tar, que reconhece o formato por si só! Um comando funciona com qualquer método de compactação suportado, de acordo com o manual .

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

etc. Se o tar der um Cannot execerro, você pode precisar sudo apt install xz-utilsprimeiro.


41
É uma característica do GNU tar. Eu não sei sobre implementações concorrentes, mas o GNU tar deve ser o mais relevante para o ubuntu. gnu.org/software/tar/manual/tar.html#SEC131
— ramslök

42
se você se deparar tar: xz: Cannot exec: No such file or directory, instale xz-utils:sudo apt-get install xz-utils
— Collin Anderson

10
Esta não é uma resposta, é uma resposta 'você não se importa com a resposta, mesmo que tenha perguntado'. Poupar um pensamento para as pessoas que não estão no 'mais recente'
— Sean Houlihane

6
Qual versão do tarnão requer mais o sinalizador específico?
— Mark Tomlin

8
@SeanHoulihane, não é uma resposta porque o OP pediu um pequeno problema XY . ramslök deu ao OP melhor do que o solicitado, e isso incluía um efetivo "Você não se importa com a resposta, mesmo que tenha perguntado", o que era apropriado porque era verdade.
— Christos Hayward

331

Experimentar

tar -xJf file.pkg.tar.xz

O -Jsinalizador que lida especificamente com arquivos .xz.


59
Gostaria de saber quantas bandeiras teremos em 2020. Como ... 45 compressões diferentes? Conhecer as opções de tar já é uma faixa preta no Linux-fu. : /
— Shiki

22
@Shiki: Provavelmente é por isso que não faz mais com que você especifique o sinalizador de formato de compactação. (Veja a resposta de ramslök.)
— Nate CK


6
Isso deve totalmente ser a resposta aceite, uma vez que responde a pergunta para qualquer versão do tar apoiando.xz
— pospi

8
No ano de 2030 bandeiras tornar Turing completa ... 2040 eles se tornam sensível
— user1359

80

Se, por algum motivo, as tarsoluções não funcionarem (talvez porque você esteja usando os recursos do OS X), tente o seguinte:

unxz < file.tar.xz > file.tar

… Que é equivalente a:

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

Em seguida, use tarpara descompactar o arquivo.


2
Isso deve ser construível com um cano.
— gerrit

6
Eu sinto que você poderia fazer unxz < file.tar.xz | tar xou algo parecido.
— Trintathreeforty

7
isso funcionou para mim, onde tar xfnão. Ubuntu 12.04
— philshem 14/08/14

Pelo menos na minha máquina Ubuntu, unxznão é equivalente a xz -dc, mas a xz -d. Então, para extrair file.tar.xzpara file.tar, você simplesmente escrever unxz file.tar.xz. Se você quiser um equivalente xz -dc, descompactar para stdout, use xzcat. Por exemplo xzcat file.tar.xz | tar x.
— Nwellnhof 25/05

30

xz é um compressor de dados sem perdas. Você terá que extrair a bola de alcatrão de xz e depois extrair o alcatrão:

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

Então você sabe extrair um alcatrão

tar -xf my_archive.tar

Fonte: XZ Utils - Wikipedia .


1
Melhor resposta. xznão precisa de redirecionamento stdout. Ainda melhor:unxz -k
— Mark Jeronimus

@ MarkJeronimus Eu não acho isso tão bom, pois cria um arquivo intermediário. Usar o tar GNU ou um pipe deve exigir menos recursos.
— Melebius

15

Eu tive o mesmo problema, o tar xfcomando não foi capaz de extraí-lo. Para corrigir isso, você precisa instalar o xz-utilspacote. A solução foi:

sudo apt-get install xz-utils

então:

tar xf myfile.tar.xz

14
tar -xvf package.tar.xz

-x - extrair arquivos

-v - lista verbalmente os arquivos processados

-f - usar arquivo especificado


5

Só quero acrescentar que, se você possui uma versão antiga do GNU tar anterior à versão 1.22, quando as opções --xz e -J ficaram disponíveis, você pode compactar ou descompactar arquivos tar.xz usando --use-compress-program xz. Por exemplo,

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

ou

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

4

Se o tar reconhecer o formato de compactação, você não precisará de um sinalizador:

tar xvf *.tar.xz

Se você precisar descompactar a entrada manualmente, por exemplo, porque seu tar é muito antigo para reconhecer xz ou você precisa de um caminho especial:

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

Os pipes são mais rápidos do que criar um arquivo intermediário descompactado e também usam menos espaço em disco!


4

Eu gosto de dtrx

sudo apt install dtrx
dtrx your-file.tar.xz

3

Uau, isso é realmente bom. Foi feito com o 7zip em um Mac? Tente o seguinte:

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

Requer 7z, que não é o que ele quer - ele quer fazê-lo inteiramente com alcatrão.
— jrg

Sim, obrigado - o "xz" me pegou! Bem, é um passo de qualquer maneira :) E tar J= tar xz, então podemos escrever tar xzf file.tar.xzcomo "normal" tar xvfz file.tar.gz. Então, basicamente, não há diferença. Não é necessário traço antes de usar o interruptor.

É quase como se a resposta fosse dada na pergunta. :)

Também fiquei impressionado porque o tar zxf errou no arquivo .xz, suponho que apenas usar J o tempo todo seria o caminho a percorrer.
— Jorge Castro

2
Sim! A página do manual não está sincronizada com a fonte: buffer.c usa -J para lzma.

3

O Ubuntu vem com o Python (Python 2.7 e Python 3), que contém os módulos necessários para extrair arquivos. Portanto, se por algum motivo o tarcomando estiver ausente (digamos que seu sysadmin o tenha removido e você não tenha sudoprivilégios para instalá-lo), pode-se usar:

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

Como um script curto, é mais legível como:

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

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

Suponha que eu criei um .xzarquivo com tar cJf thing.xz /etc/passwd. O arquivo conterá o etcdiretório com o passwdarquivo dentro. O uso do script acima resultará no etcdiretório criado no seu diretório de trabalho atual e dentro dele haverá um passwdarquivo. Obviamente, isso sempre pode ser estendido especificando o caminho onde você deseja extrair dentro da extractall()função.


0

unar é um programa simples e fácil de digitar, desarquivar praticamente qualquer formato, incluindo 7z e RAR

parece estar escrito em (GNU) Objective-C e, portanto, requer a instalação de algumas gnustepbibliotecas (implementação de Objective-C do GNU) ( gnustep-base-runtimee libgnustep-base1.25)

se você usar --install-sugere ou tiver configurado aptpara instalar pacotes sugeridos, unarsugerirá e instalará muitos programas GUI GNUStep que não são o que você deseja

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

ele criará o diretório de saída linux-sourceautomaticamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.