Створіть 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до перемикачів команд ( tar -cJvf) для багатослівного показує файли, що додаються в архів.
Стюарт Кардалл

7
З огляду на те, що замовлення важливе для тире, можливо, найкраще припустити, що замовлення завжди важливе, і поставити fостаннє, навіть без тире.
mwfearnley

1
Чи можна передавати параметри xz на зразок -e (--exended)? Мабуть, він не буде використовувати розширений за замовчуванням.
chmike

3
tarна macOS, схоже, підтримується, -Jале ця функція не надана на довільній сторінці. Довелося заглянути сюди. Хоча вони згадують XZ у розділі про --options...
cbarrick

1
@chmike Використовуйте змінну середовища XZ_OPT. Напр. XZ_OPT = "- 9e -T0".
Дзенлі

50

Перемикач -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) для деталей), і його краще не використовувати, якщо не потрібно.
Eliah Kagan

@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 Це працює, якщо у вас є дьоготь. Коли я використовував його, у мене не було правильної версії дьогтю, тому він не працював для мене. Я також хотів використати параметри стиснення для xz, що ви не можете зробити, якщо використовуєте tar. Також синтаксис трубопроводів мені простіше запам'ятати, тому я, як правило, використовую це. Але для кожного своє
Коннор

4

Спробуйте це: tar -cf file.tar file-to-compress ; xz -z file.tar

Примітка:

  1. tar.gz та tar.xz не однакові; xz забезпечує кращу компресію.
  2. Не використовуйте трубу, | оскільки це виконує команди одночасно. Використання ;або &виконання команд одна за одною.

+1 На RHEL 5.10 я не бачу Jваріанту, але це працює. Я думаю, що вам потрібен RHEL6.
Брайан

2
Чому б не відрегулювати команди для передачі висновку від tar до xz?
mwfearnley

@mwfearnley Я вважаю, що замітка лише підкреслює, що команди, необхідні для виконання послідовно. Оскільки ім'я файлу використовується в обох командах, вони не записуватимуть чи читатимуть дані зі стандартного виводу чи введення. Якщо використовувати команду, не вказуючи ім'я файлу, вони можуть бути пов'язані ланцюжком, як tar -c file-to-compress | xz -z > file.tar.xz.
Джек Q

Використання &не запускатиме команду одна за одною. Натомість він запустить перший як фоновий процес.
Луїс Лавар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.