Как мне распаковать архив, который использует .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сначала.

ramslök
источник
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.

JRG
источник
59
Интересно, сколько флагов у нас будет в 2020 году. Как ... 45 различных компрессий? Знание tar-переключателей уже является черным поясом в Linux-фу. : /
Apache
22
@Shiki: Возможно, поэтому вам больше не нужно указывать флаг формата сжатия. (См ответ ramslök.)
Нейт CK
27
xkcd.com/1168
Wordzilla
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 - Википедия .

Foxx
источник
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 - использовать указанный файл архива

nsane
источник
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
ScottH
источник
4

Если tar распознает формат сжатия, вам не нужен флаг:

tar xvf *.tar.xz

Если вам нужно распаковать ввод вручную, например, потому что ваш tar слишком стар, чтобы распознать xz, или вам нужен специальный путь:

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

Каналы работают быстрее, чем создание несжатого промежуточного файла, и занимают меньше места на диске!

Орион Лоулор
источник
4

Мне нравится dtrx

sudo apt install dtrx
dtrx your-file.tar.xz
Борис
источник
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.

кошка
источник