Как извлечь файл .tar.xz?

Вопрос или проблема

Некоторое программное обеспечение, похоже, распространяется в новом архивном формате:

$ file node-v18.7.0-linux-x64.tar.xz
node-v18.7.0-linux-x64.tar.xz: XZ compressed data

Как мне извлечь это, желательно используя tar (как я могу с gzip или bzip2)?

Несколько реализаций tar (по крайней мере GNU tar¹, star и libarchive’s bsdtar) уже поддерживают этот формат сжатия, вы можете:

  • Не указывать явно формат и позволить tar автоматически определить сжатие (с gtar², bsdtar или star³):

    tar -xf node-v18.7.0-linux-x64.tar.xz
    

    Или если вы хотите наблюдать за процессом:

    tar -xvf node-v18.7.0-linux-x64.tar.xz
    
  • Используйте -J/--xz (с GNU tar или libarchive bsdtar) или -xzstar), чтобы указать tar, что нужно ожидать XZ

    tar -xJf node-v18.7.0-linux-x64.tar.xz
    
    gtar -xJf node-v18.7.0-linux-x64.tar.xz
    
    bsdtar -xJf node-v18.7.0-linux-x64.tar.xz
    
    star -x -xz -f node-v18.7.0-linux-x64.tar.xz
    

Без этих специфичных реализаций tar или с командой pax (стандартный tar был удалён из стандарта UNIX, так как между реализациями было слишком много несовместимостей), распакуйте архив с помощью xz⁴, а затем распакуйте архив через pipe:

xz -dc node-v18.7.0-linux-x64.tar.xz | tar -xvf -
xz -dc node-v18.7.0-linux-x64.tar.xz | pax -rv

¹ обычно называется tar на системах GNU, но часто gtar, gnutar или gnu-tar на других системах, если он установлен отдельно от системного.

² с GNU tar это не работает, если файл передан на stdin с - как именем файла, или если файл не доступен для чтения, в этом случае вам нужно передать опцию -J.

³ с star это не работает, если файл не доступен для чтения, в этом случае вам нужно использовать опцию -xz. tar -xf - всё ещё работает, пока stdin доступен для чтения.

⁴ остерегайтесь, ошибки xz могут не всегда обнаруживаться в этом случае. Большинство оболочек Bourne-подобных теперь поддерживают опцию pipefail из ksh93, которая может помочь здесь; установите с set -o pipefail.

Ответ или решение

Извлечение файлов из архива формата .tar.xz может показаться сложной задачей для неопытных пользователей, однако этот процесс может быть достаточно простым при правильном выполнении. Давайте подробно разберём, как извлечь такой файл, используя практически любой доступный вам инструмент, с акцентом на использование команды tar.

Теория

Файл с расширением .tar.xz представляет собой архив, который сначала прошёл процесс архивации с использованием утилиты tar, а затем был сжат при помощи алгоритма XZ. Формат XZ, известный своей высокой степенью сжатия, часто используется для распространения программного обеспечения, так как позволяет существенно уменьшить размер файлов.

Команда tar (сокращение от "tape archive") является стандартным инструментом UNIX-систем для работы с архивами. В последние годы GNU tar и другие реализации (включая bsdtar и star) научились автоматически распознавать формат сжатия, позволяя пользователям легко извлекать файлы без необходимости вручную указывать параметры сжатия.

Пример

Допустим, что вы скачали файл node-v18.7.0-linux-x64.tar.xz. Ваша цель — извлечь его содержимое. Вот несколько способов это сделать:

  1. Автоматическое определение с использованием tar:

    Современные версии GNU tar, star и bsdtar автоматически определяют тип сжатия. Вы можете использовать следующую команду, чтобы извлечь файл:

    tar -xf node-v18.7.0-linux-x64.tar.xz

    Если вы хотите следить за ходом извлечения, добавив отображение извлекаемых файлов, используйте:

    tar -xvf node-v18.7.0-linux-x64.tar.xz
  2. Указание формата сжатия:

    Если автоматическое определение не работает, вы можете явно указать формат с помощью опции -J или --xz для GNU tar и bsdtar:

    tar -xJf node-v18.7.0-linux-x64.tar.xz

    Эти команды также можно выполнить с другими названиями для GNU tar, такими как gtar или gnutar, в зависимости от вашей системы:

    gtar -xJf node-v18.7.0-linux-x64.tar.xz

    В случае с использованием utility star, используйте:

    star -x -xz -f node-v18.7.0-linux-x64.tar.xz
  3. Использование xz и tar через канал (pipe):

    Если tar на вашей системе не поддерживает формат XZ напрямую, вы можете сначала разархивировать файл с использованием standalone утилиты xz, а затем передать данные на вход tar с помощью канала:

    xz -dc node-v18.7.0-linux-x64.tar.xz | tar -xvf -

    Для утилиты pax, которая может заменять tar в некоторых системах, команда будет следующей:

    xz -dc node-v18.7.0-linux-x64.tar.xz | pax -rv

Применение

Представьте, что для вашей системы нет стандартной поддержки GNU tar, или вы столкнулись с другой необычной ситуацией. Вы всегда можете выбрать универсальный метод с использованием xz, который потребует больше шагов, но гарантированно сработает. Обратите внимание, что иногда бывает полезно использовать параметр set -o pipefail в оболочках Bourne-подобных для того, чтобы обеспечить корректное обнаружение ошибок при использовании конвейеров.

Использование описанных методов гарантирует, что вы сможете извлекать .tar.xz файлы практически в любой UNIX-системе, учитывая различия в реализациях команды tar. Обладая этой информацией, вы уверенно сможете управлять архивами и эффективнее работать с программным обеспечением, распространяемым в этом формате.

Оцените материал
Добавить комментарий

Капча загружается...