Buat tar.xz dalam satu perintah

159

Saya mencoba membuat .tar.xzarsip terkompresi dalam satu perintah. Apa sintaksis spesifik untuk itu?

Saya sudah mencoba tar cf - file | xz file.tar.xz, tetapi itu tidak berhasil.

George K.
sumber

Jawaban:

241

Gunakan -Jopsi kompresi untuk xz. Dan ingat untuk man tar:)

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

Edit 2015-08-10:

Jika Anda meneruskan argumen ke tar dengan tanda hubung (mis: tar -cfsebagai lawan tar cf), maka -fopsi harus datang terakhir , karena itu menentukan nama file (terima kasih kepada @ABB untuk menunjukkannya!). Dalam hal ini, perintahnya terlihat seperti:

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

sumber
5
menambah vperintah switch ( tar -cJvf) menjadi verbose menunjukkan file yang ditambahkan ke arsip.
Stuart Cardall
7
Mengingat pemesanan penting dengan tanda hubung, mungkin yang terbaik untuk menganggap pemesanan selalu penting, dan menempatkan yang fterakhir, bahkan tanpa tanda hubung.
mwfearnley
1
Apakah mungkin untuk melewatkan parameter xz seperti -e (--extended)? Rupanya itu tidak akan digunakan diperpanjang secara default.
chmike
3
tarpada macOS tampaknya mendukung -Jtetapi fitur ini tidak diberikan di halaman manual. Harus mencarinya di sini. Meskipun mereka menyebutkan XZ di bagian tentang --options...
cbarrick
1
@chmike Gunakan variabel lingkungan XZ_OPT. Misalnya XZ_OPT = "- 9e -T0".
Dzenly
50

Switch -Jhanya berfungsi pada sistem yang lebih baru. Perintah universal adalah:

Untuk membuat arsip .tar.xz

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

Penjelasan

  1. tar cf - directorymembaca direktori / dan mulai meletakkannya ke format TAR. Output dari operasi ini dihasilkan pada output standar.

  2. | menyalurkan output standar ke input program lain ...

  3. ... yang kebetulan terjadi xz -z -. XZ dikonfigurasi untuk mengompresi ( -z) arsip dari input standar ( -).

  4. Anda mengarahkan output dari xzke tar.xzfile.

Wojciech Adam Koszek
sumber
16
-ftidak berarti "dari file" saat diteruskan ke xz. Sebaliknya itu adalah kependekan dari --force(lihat xz (1) untuk detailnya), dan paling baik tidak digunakan kecuali diperlukan.
Eliah Kagan
@EliahKagan Diperbaiki. Terima kasih.
Wojciech Adam Koszek
2
Untuk menggunakan kompresi multithreaded opsi -T0 dapat digunakan:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc
Keuntungan lain adalah Anda dapat dengan mudah menentukan level kompresi atau opsi lain untuk xz pada baris perintah. Misalnya jika Anda ingin mempercepat kompresi dan tidak terlalu peduli tentang ukuran yang dapat Anda gunakan -1 -T0atau -0 -T0sebagai opsi, yang biasanya masih memberi Anda file yang lebih kecil daripada gzip dalam waktu yang sebanding atau lebih cepat, sementara standarnya -6jauh lebih lambat dari gzip.
fgwaller
38

Jika Anda menyukai mode pipa, ini adalah solusi paling bersih:

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

Tidak perlu menempatkan fopsi untuk menangani file dan kemudian menggunakan -untuk menentukan bahwa file adalah input standar. Ini juga tidak perlu untuk menentukan -zopsi untuk xz, karena itu default.

Ini bekerja dengan gzipdan bzip2juga:

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

atau

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

Dekompresi juga cukup mudah:

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

Jika Anda hanya memiliki tararsip, Anda dapat menggunakan cat:

cat archive.tar | tar x

Jika Anda hanya perlu mendaftarkan file, gunakan tar t.

Rafael van Horn
sumber
8

Menggunakan opsi kompresi xz

Jika Anda ingin menggunakan opsi kompresi untuk xz, atau jika Anda menggunakan tarpada MacOS, Anda mungkin ingin menghindari tar -cJfsintaksis.

Menurut man xz, cara untuk melakukan ini adalah:

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

Karena saya suka format Wojciech Adam Koszek , tetapi tidak informasi:

  1. c membuat arsip baru untuk file yang ditentukan.
  2. fmembaca dari direktori (lebih baik menempatkan ini detik karena -cf! = -fc)
  3. - output ke Output Standar
  4. | output pipa ke perintah berikutnya
  5. xz -4epanggilan xzdengan -4eopsi kompresi. (sama dengan -4 --extreme)
  6. > baz.tar.xz mengarahkan file tar dan terkompresi ke baz.tar.xz

di mana -4e, gunakan opsi kompresi Anda sendiri. Saya sering menggunakan -kuntuk --keepfile asli dan -9untuk kompresi benar-benar berat. -zuntuk secara manual diatur xzke zip, meskipun default untuk zip jika tidak diarahkan.

Untuk uncompress dan untar

Untuk menggemakan Rafael van Horn , untuk membuka kompresi & untar (lihat catatan di bawah):

xz -dc baz.tar.xz | tar x

Catatan: tidak seperti jawaban Rafael , gunakan xz -dcsebagai ganti catxz. Dokumen merekomendasikan ini jika Anda menggunakan ini untuk skrip. Terbaik untuk memiliki kebiasaan menggunakan -datau --decompressbukannya unxzjuga. Namun, jika Anda harus, menggunakan perintah-perintah dari baris perintah baik-baik saja.

Connor
sumber
Adakah alasan khusus untuk tidak menggunakan tar -cJfsintaks pada MacOS? Hanya ingin tahu, karena saya baru saja melakukan itu dan sepertinya berhasil.
Lo-Tan
2
@ Lo-Tan Ini berfungsi jika Anda memiliki tar. Ketika saya menggunakannya saya tidak memiliki versi tar yang tepat sehingga tidak berfungsi untuk saya. Saya juga ingin menggunakan opsi kompresi untuk xz, yang tidak dapat Anda lakukan jika Anda menggunakan tar. Juga, sintaksis perpipaan lebih mudah untuk saya ingat, jadi saya cenderung menggunakannya. Tetapi untuk masing-masing mereka sendiri
Connor
4

Coba ini: tar -cf file.tar file-to-compress ; xz -z file.tar

catatan:

  1. tar.gz dan tar.xz tidak sama; xz memberikan kompresi yang lebih baik.
  2. Jangan gunakan pipa | karena ini menjalankan perintah secara bersamaan. Menggunakan ;atau &mengeksekusi perintah satu demi satu.
Jhim Preston
sumber
+1 Pada RHEL 5.10, saya tidak melihat Jopsi, tetapi ini berfungsi. Saya pikir Anda membutuhkan RHEL6.
Brian
2
Mengapa tidak menyesuaikan perintah untuk menyalurkan output dari tar ke xz?
mwfearnley
@ mwfearnley Saya pikir catatan ini hanya untuk menekankan bahwa perintah yang diperlukan untuk dieksekusi secara berurutan. Karena nama file digunakan dalam kedua perintah, mereka tidak akan menulis atau membaca data dari output atau input standar. Jika menggunakan perintah tanpa menentukan nama file, mereka dapat dirantai, seperti tar -c file-to-compress | xz -z > file.tar.xz.
Jack Q
Menggunakan &tidak akan meluncurkan perintah satu demi satu. Sebagai gantinya, itu akan meluncurkan yang pertama sebagai proses latar belakang.
Luis Lavaire