Crie um tar.xz em um comando

159

Estou tentando criar um .tar.xzarquivo compactado em um comando. Qual é a sintaxe específica para isso?

Eu tentei tar cf - file | xz file.tar.xz, mas isso não funciona.

George K.
fonte

Respostas:

241

Use a -Jopção de compactação para xz. E lembre-se de man tar:)

tar cfJ <archive.tar.xz> <files>

Editar 10/08/2015:

Se você está passando os argumentos tar com traços (por exemplo tar -cf, ao contrário de tar cf), a -fopção deve vir por último , pois especifica o nome do arquivo (obrigado a @ABB por apontar isso!). Nesse caso, o comando se parece com:

tar -cJf <archive.tar.xz> <files>

fonte
5
adicionar vao comando switches ( tar -cJvf) a ser detalhado mostra os arquivos que estão sendo adicionados ao archive.
Stuart Cardall
7
Dado que a ordem é importante com o traço, provavelmente é melhor assumir que a ordem é sempre importante e colocar o fúltimo, mesmo sem o traço.
Mkfearnley
1
É possível passar parâmetros xz como -e (- extendido)? Aparentemente, ele não será estendido por padrão.
chmike
3
tarno macOS parece suportar, -Jmas o recurso não é fornecido na página de manual. Tinha que procurar aqui em cima. Embora eles fazem XZ menção na seção sobre --options...
cbarrick
1
@chmike Use a variável de ambiente XZ_OPT. Por exemplo, XZ_OPT = "- 9e -T0".
Dzenly
50

O switch -Jfunciona apenas em sistemas mais novos. O comando universal é:

Para criar o arquivo .tar.xz

tar cf - directory/ | xz -z - > directory.tar.xz

Explicação

  1. tar cf - directorylê o diretório / e começa a colocá-lo no formato TAR. A saída desta operação é gerada na saída padrão.

  2. | canaliza a saída padrão para a entrada de outro programa ...

  3. ... o que acontece ser xz -z -. XZ está configurado para compactar ( -z) o arquivo da entrada padrão ( -).

  4. Você redireciona a saída de xzpara o tar.xzarquivo.

Wojciech Adam Koszek
fonte
16
-fnão significa "do arquivo" quando passado para xz. Em vez disso, é uma abreviação de --force(consulte xz (1) para detalhes) e é melhor não ser usado, a menos que seja necessário.
Elias Kagan
@EliahKagan Fixed. Obrigado.
Wojciech Adam Koszek
2
Para usar a compactação multithread, a opção -T0 pode ser usada:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc 10/11/18
Outra vantagem é que você pode especificar facilmente o nível de compactação ou qualquer outra opção para xz na linha de comando. Por exemplo, se você deseja acelerar a compactação e não se importa muito com o tamanho que pode usar -1 -T0ou -0 -T0como opções, o que geralmente ainda oferece um arquivo menor que o gzip em um tempo comparável ou mais rápido, enquanto o padrão -6é consideravelmente mais lento do que o gzip.
fgwaller
38

Se você gosta do modo pipe, esta é a solução mais limpa:

tar c some-dir | xz > some-dir.tar.xz

Não é necessário colocar a fopção para lidar com arquivos e depois usá-lo -para especificar que o arquivo é a entrada padrão. Também não é necessário especificar a -zopção xz, porque é o padrão.

Funciona com gzipe bzip2também:

tar c some-dir | gzip > some-dir.tar.gz

ou

tar c some-dir | bzip2 > some-dir.tar.bz2

A descompressão também é bastante direta:

xzcat tarball.tar.xz | tar x
bzcat tarball.tar.bz2 | tar x
zcat tarball.tar.gz | tar x

Se você tiver apenas tararquivamento, poderá usar cat:

cat archive.tar | tar x

Se você precisar listar apenas os arquivos, use tar t.

Rafael van Horn
fonte
8

Usando opções de compactação xz

Se você deseja usar opções de compactação para xz, ou se estiver usando tarno MacOS, provavelmente deseja evitar a tar -cJfsintaxe.

De acordo com man xz, a maneira de fazer isso é:

tar cf - baz | xz -4e > baz.tar.xz

Porque gostei do formato de Wojciech Adam Koszek , mas não da informação:

  1. c cria um novo arquivo morto para os arquivos especificados.
  2. flê de um diretório (melhor colocar este segundo porque -cf! = -fc)
  3. - saídas para saída padrão
  4. | canaliza a saída para o próximo comando
  5. xz -4echama xzcom a -4eopção de compactação. (igual a -4 --extreme)
  6. > baz.tar.xz direciona o arquivo tarredado e compactado para baz.tar.xz

Onde -4eestá, use suas próprias opções de compactação. Costumo usar -kpara --keepo arquivo original e -9para a compressão realmente pesado. -zpara definir manualmente xzcomo zip, embora o padrão seja zipar se não for indicado de outra forma.

Para descompactar e descompactar

Para ecoar Rafael van Horn , descompactar e descompactar (veja a nota abaixo):

xz -dc baz.tar.xz | tar x

Nota: ao contrário da resposta de Rafael , use em xz -dcvez de catxz. Os documentos recomendam isso caso você esteja usando isso para scripts. Melhor ter o hábito de usar -dou em --decompressvez de unxztambém. No entanto, se necessário, o uso desses comandos na linha de comando é bom.

Connor
fonte
Algum motivo específico para não usar a tar -cJfsintaxe no MacOS? Apenas curioso, porque eu estava fazendo isso agora e parecia estar funcionando.
Lo-Tan
2
@ Lo-Tan Funciona se você tiver alcatrão. Quando eu estava usando, não tinha a versão correta do tar, então não funcionou para mim. Eu também queria usar as opções de compactação do xz, o que você não pode fazer se usar o tar. Além disso, a sintaxe do canal é mais fácil para eu lembrar, então eu costumo usá-lo. Mas para cada um o seu
Connor
4

Tente o seguinte: tar -cf file.tar file-to-compress ; xz -z file.tar

Nota:

  1. tar.gz e tar.xz não são os mesmos; xz fornece melhor compactação.
  2. Não use pipe, | pois isso executa comandos simultaneamente. Usando ;ou &executa comandos um após o outro.
Jhim Preston
fonte
+1 No RHEL 5.10, não vejo uma Jopção, mas isso funciona. Eu acho que você precisa do RHEL6.
Brian
2
Por que não ajustar os comandos para canalizar a saída de tar para xz?
Mkfearnley
@mwfearnley Acho que a nota é apenas para enfatizar que os comandos precisam ser executados sequencialmente. Como o nome do arquivo é usado nos dois comandos, eles não gravam nem lêem dados da saída ou entrada padrão. Se você usar o comando sem especificar o nome do arquivo, eles poderão ser encadeados, como tar -c file-to-compress | xz -z > file.tar.xz.
Jack Q
O uso &não inicia um comando um após o outro. Em vez disso, ele iniciará o primeiro como um processo em segundo plano.
Luis Lavaire