Как мне распаковать архив, который использует .xz?


775

Я привык извлекать тарболы с -xfzфлагом, который обрабатывает архивы gzip и bzip2.

Недавно я столкнулся с .tar.xzфайлом, и я хотел бы распаковать его за один шаг, используя tar, как я могу это сделать?


10
обратите внимание, что вам, возможно, придется установить, xz-utilsесли еще нет
Тобиас Кинцлер

вот мой маленький сценарий, который угадывает для вас флаги tar: gist.github.com/shime/5908634
shime

2
tar --helpсписки tarфлагов. -xzfотносится к gzip. -xjfк bz2. -xJfк xz.
noobninja

Ответы:


1016

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 должен быть наиболее актуальным для Ubuntu. 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
Коллин Андерсон

10
Это не ответ, это ответ «вас не волнует ответ, даже если вы его спросили». Подумайте о людях, которые не в «последней»
Шон Хулихейн

6
Какая версия tarбольше не требует определенного флага?
Марк Томлин

8
@SeanHoulihane, это не ответ, потому что ОП задал небольшую проблему XY . ramslök дал ОП лучше, чем его просили, и это включало в себя эффективную фразу «Вас не волнует ответ, даже если вы спросили», что было уместно, потому что это было правдой.
Христос Хейворд,

331

Пытаться

tar -xJf file.pkg.tar.xz

Это -Jфлаг, который конкретно работает с файлами .xz.


59
Интересно, сколько флагов у нас будет в 2020 году. Как ... 45 различных компрессий? Знание tar-переключателей уже является черным поясом в Linux-фу. : /
Apache

22
@Shiki: Возможно, поэтому вам больше не нужно указывать флаг формата сжатия. (См ответ ramslök.)
Нейт 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чтобы распаковать файл.


2
Это должно быть построено с трубой.
gerrit

6
Я чувствую, что вы могли бы просто сделать unxz < file.tar.xz | tar xили подобное.
тридцать три

7
это сработало для меня, где tar xfнет. Ubuntu 12.04
philshem

По крайней мере, на моей машине Ubuntu, 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

31

XZ - компрессор данных без потерь. Вам нужно будет извлечь tar-шар из xz, а затем извлечь tar:

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

Тогда вы знаете, чтобы извлечь смолу

tar -xf my_archive.tar

Источник: XZ Utils - Википедия .


1
Лучший ответ. xzне нуждается в перенаправлении stdout. Еще лучше:unxz -k
Марк

@MarkJeronimus Я не нахожу это настолько хорошим, поскольку он создает промежуточный файл. Использование GNU tar или канала должно потребовать меньше ресурсов.
Мелебиус

15

У меня была такая же проблема, tar xfкоманда не смогла ее извлечь. Чтобы это исправить, вам нужно установить xz-utilsпакет. Решение было:

sudo apt-get install xz-utils

тогда:

tar xf myfile.tar.xz

14
tar -xvf package.tar.xz

-x - извлечь файлы

-v - подробный список обработанных файлов

-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 все время было бы правильным решением.
Хорхе Кастро

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 довольно хорошая простая и легко набираемая программа для разархивирования практически любого формата, включая 7z и RAR

кажется, что он написан на (GNU) Objective-C и поэтому требует установки некоторых gnustep(реализация GNU Objective-C) библиотек ( gnustep-base-runtimeи libgnustep-base1.25)

Если вы используете --install-Suggested или настроили aptустановку предложенных пакетов, unarпредложит и установит множество программ GUI GNUStep, которые вам не подходят

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

он автоматически создаст выходной каталог linux-source.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.