ฉันจะคลายการบีบอัด tarball ที่ใช้. xz ได้อย่างไร


776

ฉันคุ้นเคยกับการดึง tarballs ด้วย-xfzธงซึ่งจัดการกับ gzip และ bzip2 archives

เมื่อเร็ว ๆ นี้ฉันพบ.tar.xzไฟล์และฉันต้องการคลายการบีบอัดในขั้นตอนเดียวโดยใช้tarฉันจะทำอย่างไร


10
โปรดทราบว่าคุณอาจต้องติดตั้งxz-utilsหากยังไม่ปรากฏ
Tobias Kienzler

นี่คือสคริปต์ตัวน้อยของฉันที่คาดเดา tar สำหรับคุณ: gist.github.com/shime/5908634
shime

2
tar --helpรายการtarธง นำไปใช้กับ -xzf ไปยัง ไปยัง gzip-xjfbz2-xJfxz
noobninja

คำตอบ:


1017

Ubuntu มี GNU tar ซึ่งรู้จักรูปแบบด้วยตัวเอง! คำสั่งหนึ่งทำงานร่วมกับวิธีการบีบอัดใด ๆ ที่ได้รับการสนับสนุนต่อคู่มือการใช้งาน

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

เป็นต้นหาก tar มีCannot execข้อผิดพลาดคุณอาจต้องทำsudo apt install xz-utilsก่อน


41
มันเป็นคุณสมบัติของ GNU tar ฉันไม่รู้เกี่ยวกับการใช้งานการแข่งขัน แต่ GNU tar ควรเกี่ยวข้องกับอูบุนตูมากที่สุด gnu.org/software/tar/manual/tar.html#SEC131
ramslök

42
หากคุณพบtar: xz: Cannot exec: No such file or directoryว่าติดตั้งxz-utils:sudo apt-get install xz-utils
Collin Anderson

10
นี่ไม่ใช่คำตอบมันเป็น 'คุณไม่สนใจคำตอบแม้ว่าคุณจะถาม' การตอบสนอง เผื่อไว้สำหรับคนที่ไม่ได้อยู่ใน 'ล่าสุด'
ฌอน Houlihane

6
เวอร์ชันtarใดที่ไม่ต้องการการตั้งค่าสถานะเฉพาะอีกต่อไป
Mark Tomlin

8
@SeanHoulihane ก็ไม่ได้คำตอบเพราะ OP ถามผู้เยาว์ปัญหา XY ramslökให้ OP ดีกว่าถูกถามและรวมถึงการมีประสิทธิภาพ "คุณไม่สนใจคำตอบแม้ว่าคุณจะถาม" ซึ่งเหมาะสมเพราะมันเป็นเรื่องจริง
Christos Hayward

331

ลอง

tar -xJf file.pkg.tar.xz

-Jเป็นธงที่เฉพาะที่เกี่ยวข้องกับไฟล์ .xz


59
ฉันสงสัยว่าเราจะมีกี่ธงในปี 2020 เช่น ... 45 การบีบอัดที่แตกต่างกัน? การรู้จักสวิตช์ของ tar นั้นเป็นแถบดำใน Linux-fu อยู่แล้ว : /
ชิกิ

22
@Shiki: นั่นอาจเป็นเหตุผลว่าทำไมมันไม่ทำให้คุณระบุรูปแบบการบีบอัดอีกต่อไป (ดูคำตอบของramslök)
Nate CK


6
นี่ควรเป็นคำตอบที่ได้รับการยอมรับอย่างสิ้นเชิงเนื่องจากตอบคำถามสำหรับรุ่นใด ๆ ที่สนับสนุน tar.xz
pospi

8
ในปี 2030 ธงกลายเป็นทัวริงสมบูรณ์ ... 2040 พวกเขากลายเป็นเกรียวกราว
user1359

80

หากเหตุผลบางอย่างtarโซลูชันไม่ทำงาน (อาจเป็นเพราะคุณใช้ OS X ในตัว) ลองทำสิ่งนี้:

unxz < file.tar.xz > file.tar

... ซึ่งเทียบเท่ากับ:

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

จากนั้นใช้tarเพื่อ untar ไฟล์


2
ที่ควรจะสร้างได้ด้วยท่อ
gerrit

6
ฉันรู้สึกว่าคุณสามารถทำได้unxz < file.tar.xz | tar xหรือคล้ายกัน
สามสิบสาม

7
มันใช้งานได้สำหรับฉันที่tar xfไม่ได้ ubuntu 12.04
philshem

อย่างน้อยในเครื่องอูบุนตูของฉันunxzจะไม่เทียบเท่ากับแต่xz -dc xz -dดังนั้นเพื่อดึงfile.tar.xzไปคุณก็ต้องการเขียนfile.tar unxz file.tar.xzถ้าคุณต้องการที่เทียบเท่ากับxz -dc, คลายไป stdout xzcatใช้ xzcat file.tar.xz | tar xเช่น
nwellnhof

30

xz เป็นตัวบีบอัดข้อมูลแบบไม่สูญเสียข้อมูล คุณจะต้องดึงลูกทาร์ออกจาก xz แล้วแยกลูกทาร์

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

ถ้าอย่างนั้นคุณก็รู้ที่จะสกัดน้ำมันดิน

tar -xf my_archive.tar

ที่มา: XZ Utils - วิกิพีเดีย


1
คำตอบที่ดีที่สุด xzไม่ต้องการการเปลี่ยนเส้นทาง stdout ดียิ่งขึ้น:unxz -k
Mark Jeronimus

@ MarkJeronimus ฉันไม่คิดว่ามันดีขนาดนี้เพราะมันสร้างไฟล์ระดับกลาง ใช้tar GNUหรือท่อควรต้องการทรัพยากรน้อย
Melebius

15

ฉันมีปัญหาเดียวกันtar xfคำสั่งไม่สามารถแยกได้ ในการแก้ไขปัญหานี้คุณจะต้องติดตั้งxz-utilsแพคเกจ ทางออกคือ:

sudo apt-get install xz-utils

แล้ว:

tar xf myfile.tar.xz

14
tar -xvf package.tar.xz

-x - แตกไฟล์

-v - ประมวลผลไฟล์รายการ verbosely

-f - ใช้ไฟล์เก็บถาวรที่ระบุ


5

เพียงแค่ต้องการที่จะเพิ่มว่าถ้าคุณมีรุ่นเก่าGNU tarก่อนที่จะมีรุ่น 1.22 เมื่อ --xz และ -J ตัวเลือกกลายเป็นใช้ได้คุณสามารถบีบอัดหรือขยายขนาดไฟล์ tar.xz --use-compress-program xzโดยใช้ ตัวอย่างเช่น,

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

หรือ

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

4

หาก tar รู้จักรูปแบบการบีบอัดคุณไม่จำเป็นต้องมีการตั้งค่าสถานะ:

tar xvf *.tar.xz

หากคุณต้องการคลายการบีบอัดข้อมูลด้วยตนเองเช่นเนื่องจาก tar ของคุณเก่าเกินกว่าที่จะรับรู้ xz หรือคุณต้องการเส้นทางพิเศษ:

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

ไพพ์นั้นเร็วกว่าการสร้างไฟล์สื่อกลางที่ไม่มีการบีบอัดและใช้พื้นที่ดิสก์น้อยลงเช่นกัน!



3

ว้าวนั่นเป็นสิ่งที่ดีจริงๆ ทำกับ 7zip บน Mac หรือไม่ ลองสิ่งนี้:

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

ต้องใช้ 7z ซึ่งไม่ใช่สิ่งที่เขาต้องการ - เขาต้องการทำมันทั้งหมดในน้ำมันดิน
jrg

ใช่ขอบคุณ - "xz" มาให้ฉัน! ดีก็เป็นหนึ่งในขั้นตอนอยู่แล้ว :) และtar J= tar xzดังนั้นเราอาจจะเขียนtar xzf file.tar.xzเช่น tar xvfz file.tar.gz"ปกติ" ดังนั้นโดยทั่วไปไม่มีความแตกต่าง ไม่ต้องการเส้นประก่อนใช้สวิตช์

มันเกือบเหมือนคำตอบที่ได้รับในคำถาม :)

ฉันถูกโยนออกไปด้วยเพราะ tar zxf เกิดข้อผิดพลาดในไฟล์. xz ฉันคิดว่าแค่ใช้ J ตลอดเวลาจะเป็นวิธีที่จะไป
Jorge Castro

2
ได้! หน้าคู่มือไม่ได้ซิงค์กับแหล่งที่มา: buffer.c ใช้ -J สำหรับ lzma

3

Ubuntu มาพร้อมกับ Python (Python 2.7 และ Python 3) ซึ่งมีโมดูลที่จำเป็นสำหรับการแยกไฟล์เก็บถาวร ดังนั้นหากtarคำสั่งด้วยเหตุผลใดก็ตามหายไป (บอกว่าดูแลระบบของคุณลบมันและคุณไม่มีsudoสิทธิ์ที่จะติดตั้ง) คุณสามารถใช้:

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

ในฐานะสคริปต์สั้น ๆ คุณสามารถอ่านได้มากขึ้นว่า:

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

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

สมมติว่าฉันสร้างไฟล์ที่มี.xz tar cJf thing.xz /etc/passwdไฟล์เก็บถาวรจะมีetcไดเรกทอรีพร้อมpasswdไฟล์อยู่ภายใน การใช้สคริปต์ข้างต้นจะส่งผลให้etcไดเรกทอรีที่สร้างขึ้นในไดเรกทอรีการทำงานปัจจุบันของคุณและภายในมันจะเป็นpasswdไฟล์ แน่นอนว่าสิ่งนี้สามารถขยายได้เสมอโดยการระบุเส้นทางที่คุณต้องการดึงข้อมูลภายในextractall()ฟังก์ชั่น


0

unar ค่อนข้างง่ายโปรแกรมดีและพิมพ์ง่าย unarchive เกือบทุกรูปแบบรวมถึง 7z และ RAR

ดูเหมือนว่ามันจะถูกเขียนใน (GNU) Objective-C และต้องมีการติดตั้งgnustepไลบรารี (การใช้งาน Objective-C) ของไลบรารี ( gnustep-base-runtimeและ libgnustep-base1.25)

ถ้าคุณใช้ - ติดตั้ง - แนะนำหรือกำหนดค่าaptให้ติดตั้งแพ็คเกจที่unarแนะนำจะแนะนำและติดตั้งโปรแกรม GUI GNUStep จำนวนมากซึ่งไม่ใช่สิ่งที่คุณต้องการ

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

มันจะสร้างไดเรกทอรีผลลัพธ์linux-sourceโดยอัตโนมัติ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.