Bagaimana cara saya mengompres tarball yang menggunakan .xz?

775

Saya terbiasa mengekstraksi tarbal dengan -xfzbendera, yang menangani arsip gzip dan bzip2.

Baru-baru ini saya mengalami .tar.xzfile dan saya ingin membuka kompresi dalam satu langkah menggunakan tar, bagaimana saya bisa melakukan itu?

Jorge Castro
sumber
10
perhatikan Anda mungkin harus menginstal xz-utilsjika belum ada
Tobias Kienzler
inilah skrip kecil saya yang menebak flag tar untuk Anda: gist.github.com/shime/5908634
shime
2
tar --helpdaftar tarbendera. -xzfberlaku untuk gzip. -xjfuntuk bz2. -xJfuntuk xz.
noobninja

Jawaban:

1016

Ubuntu menyertakan GNU tar, yang mengenali format dengan sendirinya! Satu perintah berfungsi dengan metode kompresi apa pun yang didukung, per manual .

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

dll. Jika tar memberikan Cannot execkesalahan, Anda mungkin perlu sudo apt install xz-utilsterlebih dahulu.

ramslök
sumber
41
Ini adalah fitur tar GNU. Saya tidak tahu tentang implementasi yang bersaing, tetapi tar GNU harus menjadi yang paling relevan untuk ubuntu. gnu.org/software/tar/manual/tar.html#SEC131
ramslök
42
jika Anda bertemu tar: xz: Cannot exec: No such file or directory, instal xz-utils:sudo apt-get install xz-utils
Collin Anderson
10
Ini bukan jawaban, itu adalah jawaban 'Anda tidak peduli dengan jawabannya, meskipun Anda bertanya'. Jangan khawatir dengan orang-orang yang tidak 'terbaru'
Sean Houlihane
6
Versi apa yang tartidak lagi membutuhkan tanda khusus?
Mark Tomlin
8
@SHeHoulihane, itu bukan jawaban karena OP menanyakan masalah XY kecil . ramslök memberikan OP lebih baik daripada yang diminta, dan itu termasuk "Anda tidak peduli dengan jawabannya, meskipun Anda bertanya" yang efektif karena itu benar.
Christos Hayward
331

Mencoba

tar -xJf file.pkg.tar.xz

Ini -Jadalah flag yang khusus menangani file .xz.

jrg
sumber
59
Saya ingin tahu berapa banyak bendera yang akan kita miliki di tahun 2020. Seperti ... 45 kompresi berbeda? Mengetahui tar switch sudah menjadi sabuk hitam di Linux-fu. : /
Shiki
22
@Shiki: Mungkin karena itu tidak membuat Anda menentukan flag format kompresi lagi. (Lihat jawaban ramslök.)
Nate CK
27
xkcd.com/1168
Wordzilla
6
Ini benar-benar harus menjadi jawaban yang diterima karena menjawab pertanyaan untuk versi tar yang mendukung.xz
pospi
8
Pada tahun 2030 bendera menjadi lengkap Turing ... 2040 mereka menjadi mahluk hidup
user1359
80

Jika karena alasan tertentu tarsolusinya tidak berfungsi (mungkin karena Anda menggunakan bawaan OS X), coba ini:

unxz < file.tar.xz > file.tar

... yang setara dengan:

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

Kemudian gunakan taruntuk membuka file.

Mathias Bynens
sumber
2
Itu harus dapat dibangun dengan pipa.
gerrit
6
Saya merasa Anda bisa melakukan unxz < file.tar.xz | tar xatau serupa.
puluh tiga
7
ini bekerja untuk saya, di mana tar xftidak. ubuntu 12.04
philshem
Setidaknya di mesin Ubuntu saya, unxztidak setara dengan xz -dc, tetapi untuk xz -d. Jadi untuk mengekstrak file.tar.xzuntuk file.tar, Anda akan hanya menulis unxz file.tar.xz. Jika Anda ingin yang setara dengan xz -dc, dekompresi ke stdout, gunakan xzcat. Sebagai contoh xzcat file.tar.xz | tar x.
nwellnhof
30

xz adalah kompresor data lossless. Anda harus mengekstrak bola tar dari xz dan kemudian mengekstrak tar:

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

Maka Anda tahu untuk mengekstrak tar

tar -xf my_archive.tar

Sumber: XZ Utils - Wikipedia .

Foxx
sumber
1
Jawaban Terbaik. xztidak perlu pengalihan stdout. Bahkan lebih baik:unxz -k
Mark Jeronimus
@ MarkJeronimus Saya tidak menemukan ini begitu baik karena itu membuat file perantara. Menggunakan tar GNU atau pipa harus menuntut lebih sedikit sumber daya.
Melebius
15

Saya memiliki masalah yang sama, tar xfperintah tidak dapat mengekstraknya. Untuk memperbaiki ini, Anda perlu menginstal xz-utilspaket. Solusinya adalah:

sudo apt-get install xz-utils

kemudian:

tar xf myfile.tar.xz
Zsolt Sky
sumber
14
tar -xvf package.tar.xz

-x - ekstrak file

-v - daftar file yang diproses secara lisan

-f - Gunakan file arsip yang ditentukan

nsane
sumber
5

Hanya ingin menambahkan bahwa jika Anda memiliki versi lama GNU tar sebelum versi 1.22 ketika opsi --xz dan -J tersedia, Anda bisa mengompres atau mendekompres file tar.xz dengan menggunakan --use-compress-program xz. Sebagai contoh,

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

atau

tar --use-compress-program xz -xf example.tar.xz
ScottH
sumber
4

Jika tar mengenali format kompresi, Anda tidak perlu flag:

tar xvf *.tar.xz

Jika Anda perlu mendekompres input secara manual, misalnya karena tar Anda terlalu tua untuk mengenali xz, atau Anda memerlukan jalur khusus:

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

Pipa lebih cepat daripada membuat file perantara yang tidak terkompresi, dan menggunakan lebih sedikit ruang disk juga!

Orion Lawlor
sumber
4

Saya suka dtrx

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

Wow, itu benar-benar bagus. Apakah itu dilakukan dengan 7zip di Mac? Coba ini:

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

sumber
Membutuhkan 7z, yang bukan itu yang ia inginkan - ia ingin melakukannya sepenuhnya dalam tar.
jrg
Ya, terima kasih - "xz" membuat saya! Yah, itu satu langkah lagi :) Dan tar J= tar xz, jadi kita mungkin menulis tar xzf file.tar.xzseperti "normal" tar xvfz file.tar.gz. Jadi pada dasarnya tidak ada perbedaan. Tidak perlu tanda hubung sebelum menggunakan sakelar.
Ini hampir seperti jawaban yang diberikan dalam pertanyaan itu. :)
Saya terlempar juga karena tar zxf kesalahan pada file .xz, saya kira hanya menggunakan J sepanjang waktu akan menjadi cara untuk pergi.
Jorge Castro
2
Ya! Halaman manual tidak sinkron dengan sumber: buffer.c menggunakan -J untuk lzma.
3

Ubuntu hadir dengan Python (Python 2.7 dan Python 3), yang berisi modul-modul yang diperlukan untuk mengekstraksi arsip. Jadi jika karena alasan apa pun tarperintah tidak ada (misalkan sysadmin Anda telah menghapusnya dan Anda tidak memiliki sudoprivillege untuk menginstalnya), Anda dapat menggunakan:

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

Sebagai skrip pendek, itu lebih mudah dibaca sebagai:

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

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

Misalkan saya membuat .xzfile dengan tar cJf thing.xz /etc/passwd. Arsip akan berisi etcdirektori dengan passwdfile di dalamnya. Menggunakan skrip di atas akan menghasilkan etcdirektori yang dibuat di direktori kerja Anda saat ini, dan di dalamnya akan ada passwdfile. Tentu saja, ini selalu dapat diperpanjang dengan menentukan jalur tempat Anda ingin mengekstrak di dalam extractall()fungsi.

Sergiy Kolodyazhnyy
sumber
0

unar adalah program sederhana yang cukup bagus dan mudah diketik, untuk mengarsipkan hampir semua format termasuk 7z dan RAR

tampaknya ditulis dalam (GNU) Objective-C dan karenanya memerlukan instalasi dari beberapa gnustep(implementasi Objective-C GNU) perpustakaan ( gnustep-base-runtimedan libgnustep-base1.25)

jika Anda menggunakan --install-suggest atau telah mengkonfigurasi aptuntuk menginstal paket yang disarankan, unarakan menyarankan dan menginstal banyak program GUI GNUStep yang bukan yang Anda inginkan

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

itu akan membuat direktori keluaran linux-sourcesecara otomatis.

kucing
sumber