нехай tar автоматично виявляє тип стиснення при витягуванні з stdin


16

Я використовую дьоготь GNU. Він може автоматично визначати тип стиснення при стисненні / розпакуванні файлів. Але мені потрібно розпакувати архів зі stdin, і тип компресу невідомий. Я помітив, що дьоготь може дати мені правильну пропозицію на кшталт:

tar: Archive is compressed. Use -z option

Але я хочу, щоб tar використовував цю опцію стиснення автоматично, не вимагаючи ввести цей аргумент. Як я можу це зробити? Чому б не смола просто розпакувати, оскільки вона вже знає тип стиснення?

Дякую!


Розвиватися в ньому було не важко, але досі це не робиться.
петерх

3
Причина, по якій він не може цього зробити, полягає в тому, що tarвін не знає, який тип даних у нього є, stdinпоки він не прочитає їх, і тоді вже пізно зателефонувати в програму для скасування. Він підтримує gzip, bzip2 та інші. Усунути цю проблему непросто (доведеться буферувати дані), тому вона просто каже вам спробувати ще раз.
Кевін Панько

@KevinPanko Чому куди пізно? Ні, ще не пізно. Він читає fe перший 4K у буфері, перевіряє його тип стиснення (якщо такий є), а потім викликає програму. Це буферизація складала 10-20 рядків додаткового коду С.
петерх

2
У той момент, коли він знає, які дані має, він більше не може використовувати простий fork()/ exec()метод для передачі даних за допомогою утиліти без стискання. Утиліта буде читати з stdinтруби, і перші 4K тепер бракували б. Немає способу повернути дані назад у трубу після її читання.
Кевін Панько

3
@KevinPanko: Хоча це можна зробити, роздвоявши два процеси, в основному, виконуючи еквівалент cat buffer - | gunzip. (Крім того, не блокуючи введення / виведення можна використовувати, щоб уникнути необхідності в додатковому процесі.)
Ilmari Karonen

Відповіді:


10

Це не відповідь, яку ви хочете почути, але це не підтримується гуртом GNU відповідно до його посібника:

Єдиний випадок, коли вам потрібно вказати параметр декомпресії під час читання архіву, - це при читанні з труби або з магнітоли, яка не підтримує випадковий доступ. Однак у цьому випадку гугл GNU вкаже, який варіант слід використовувати. Наприклад:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

Якщо ви бачите таку діагностику, просто додайте запропонований варіант до виклику гудрону GNU:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Створення та читання стислих архівів


2
Зверніть увагу, це працює в команді tar на OSX, але не в Linux, використовуючи tar GNU. Так це можна було б виправити.
Шон Перрі

8

Нарешті, я зрозумів, що причиною того, що я не можу дозволити дьогтю виявляти та розпаковувати архів зі stdin, є те, що я використовую гугл GNU. BSD tar може це зробити автоматично без проблем. Тому я вирішую використовувати bsdtar замість смоли зараз у своєму сценарії.

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