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?

Jorge Castro
fonte
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.

ramslök
fonte
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.

jrg
fonte
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
27
xkcd.com/1168
Wordzilla 25/03
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.

Mathias Bynens
fonte
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 .

Foxx
fonte
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
Zsolt Sky
fonte
14
tar -xvf package.tar.xz

-x - extrair arquivos

-v - lista verbalmente os arquivos processados

-f - usar arquivo especificado

nsane
fonte
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
ScottH
fonte
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!

Orion Lawlor
fonte
4

Eu gosto de dtrx

sudo apt install dtrx
dtrx your-file.tar.xz
Boris
fonte
3

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

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

fonte
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.

Sergiy Kolodyazhnyy
fonte
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.

gato
fonte