Создайте tar.xz в одной команде

159

Я пытаюсь создать .tar.xz сжатый архив в одной команде. Какой конкретный синтаксис для этого?

Я пытался tar cf - file | xz file.tar.xz, но это не работает.

Джордж К.
источник

Ответы:

241

Используйте параметр -Jсжатия для xz. И не забудьте man tar:)

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

Изменить 2015-08-10:

Если вы передаете аргументы tar с дефисами (например, tar -cfв отличие от tar cf), тогда -fопция должна быть последней , поскольку она задает имя файла (спасибо @ABB за указание на это!). В этом случае команда выглядит так:

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

источник
5
добавление vк команде switch ( tar -cJvf), чтобы быть подробным, показывает файлы, добавляемые в архив.
Стюарт Кардалл
7
Учитывая порядок важности с тире, вероятно, лучше предположить, что порядок всегда важен, и поставить fпоследний, даже без тире.
mwfearnley
1
Можно ли передать параметры xz, такие как -e (--extended)? По-видимому, он не будет использовать расширенный по умолчанию.
chmike
3
tarна MacOS, кажется, поддерживает, -Jно функция не указана на странице руководства. Пришлось посмотреть это здесь. Хотя они упоминают XZ в разделе --options...
cbarrick
1
@chmike Использовать переменную окружения XZ_OPT. Например, XZ_OPT = "- 9e -T0".
Dzenly
50

Switch -Jработает только на новых системах. Универсальная команда это:

Сделать архив .tar.xz

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

объяснение

  1. tar cf - directoryчитает каталог / и начинает переводить его в формат TAR. Вывод этой операции генерируется на стандартном выводе.

  2. | выводит стандартный вывод на вход другой программы ...

  3. ... что случилось xz -z -. XZ настроен на сжатие ( -z) архива со стандартного ввода (- ).

  4. Вы перенаправить вывод из xzк tar.xzфайлу.

Войцех Адам Кошек
источник
16
-fне означает "из файла" при передаче в xz. Вместо этого оно сокращенно --force(см. Xz (1) для подробностей), и его лучше не использовать, если в этом нет необходимости.
Элия ​​Каган,
@EliahKagan Исправлено. Спасибо.
Войцех Адам Кошек
2
Для использования многопоточного сжатия можно использовать опцию -T0:tar cf - directory/ | xz -z -T0 - > directory.tar.xz
oidualc
Еще одним преимуществом является то, что вы можете легко указать уровень сжатия или любой другой параметр для xz в командной строке. Например, если вы хотите ускорить сжатие и не заботитесь о размере, который вы можете использовать -1 -T0или -0 -T0как опции, который обычно все равно даст вам файл меньшего размера, чем gzip, в сопоставимое или более быстрое время, в то время как значение по умолчанию -6значительно медленнее чем GZIP.
fgwaller
38

Если вам нравится режим конвейера, это самое чистое решение:

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

Нет необходимости ставить fопцию, чтобы иметь дело с файлами, а затем использовать, -чтобы указать, что файл является стандартным вводом. Также не обязательно указывать -zопцию для xz, потому что это по умолчанию.

Это работает с gzipи bzip2тоже:

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

или

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

Распаковка также довольно проста:

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

Если у вас есть только tarархив, вы можете использовать cat:

cat archive.tar | tar x

Если вам нужно только перечислить файлы, используйте tar t.

Рафаэль ван Хорн
источник
8

Использование параметров сжатия xz

Если вы хотите использовать параметры сжатия для xzили, если вы используете tarв MacOS, вы, вероятно, хотите избежать tar -cJfсинтаксиса.

Согласно man xz, способ сделать это:

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

Потому что мне понравился формат Войцеха Адама Кошека , а не информация:

  1. c создает новый архив для указанных файлов.
  2. fчитает из каталога (лучше всего поставить эту секунду, потому что -cf! = -fc)
  3. - вывод на стандартный вывод
  4. | вывод труб к следующей команде
  5. xz -4eзвонки xzс -4eопцией сжатия. (равно -4 --extreme)
  6. > baz.tar.xz направляет сжатый и сжатый файл в baz.tar.xz

где -4e, используйте свои собственные параметры сжатия. Я часто использую -kв --keepисходном файле и -9на самом деле сильной компрессии. -zвручную установить xzzip, хотя по умолчанию используется zip, если не указано иное.

Разархивировать и распаковать

Чтобы повторить Рафаэля ван Хорна , чтобы распаковать и распаковать (см. Примечание ниже):

xz -dc baz.tar.xz | tar x

Примечание: в отличие от ответа Рафаэля , используйте xz -dcвместо catxz. Документы рекомендуют это в случае, если вы используете это для сценариев. Лучше всего иметь привычку использовать -dили --decompressвместо этого unxz. Тем не менее, если вам нужно, использовать эти команды из командной строки, это нормально.

Коннор
источник
Есть какая-то конкретная причина не использовать tar -cJfсинтаксис в MacOS? Просто любопытно, потому что я делал это только сейчас, и это, казалось, работало.
Ло-Тан
2
@ Lo-Tan Это работает, если у вас есть смола. Когда я использовал его, у меня не было правильной версии tar, поэтому он не работал для меня. Я также хотел использовать параметры сжатия для xz, чего нельзя сделать, если вы используете tar. Кроме того, синтаксис конвейера мне легче запомнить, поэтому я склонен его использовать. Но каждому свое
Коннор
4

Попробуй это: tar -cf file.tar file-to-compress ; xz -z file.tar

Примечание:

  1. tar.gz и tar.xz - это не одно и то же; XZ обеспечивает лучшее сжатие.
  2. Не используйте pipe, | потому что он запускает команды одновременно. Использование ;или выполнение &команд одна за другой.
Джим Престон
источник
+1 На RHEL 5.10 я не вижу Jварианта, но это работает. Я думаю, что вам нужен RHEL6.
Брайан
2
Почему бы не настроить команды для передачи вывода из tar в xz?
mwfearnley
@mwfearnley Я думаю, что примечание просто для того, чтобы подчеркнуть, что команды должны выполняться последовательно. Поскольку имя файла используется в обеих командах, они не будут записывать или читать данные из стандартного вывода или ввода. Если команда используется без указания имени файла, они могут быть объединены в цепочку, например tar -c file-to-compress | xz -z > file.tar.xz.
Джек К,
Использование &не запускает команду один за другим. Вместо этого он запустит первый как фоновый процесс.
Луис Лавэр