позволить tar автоматически определять тип сжатия при извлечении из stdin

16

Я использую GNU tar. Он может автоматически определять тип сжатия при сжатии / распаковке файлов. Но мне нужно распаковать архив из stdin и тип сжатия неизвестен. Я заметил, что tar может дать мне правильное предложение вроде:

tar: Archive is compressed. Use -z option

Но я хочу, чтобы tar использовал эту опцию сжатия автоматически, без запроса ввода этого аргумента. Как я могу это сделать? Почему бы просто не распаковать tar, поскольку он уже знает тип сжатия?

Спасибо!

Джеймс
источник
В нем было нетрудно развиваться, но это не сделано до сих пор.
Петер - Восстановить Монику
3
Причина, по которой он не может этого сделать, заключается в том, что tarон не знает, к какому типу данных он относится, stdinдо тех пор, пока не прочитает их, и к тому времени уже слишком поздно вызывать программу распаковки. Он поддерживает gzip, bzip2 и другие. Обойти эту проблему нелегко (придется буферизовать данные), поэтому он просто говорит вам попробовать еще раз.
Кевин Панко
@KevinPanko, Почему, где это слишком поздно? Нет, еще не поздно Он читает первые 4K в буфере, проверяет его тип сжатия (если он есть), затем вызывает программу. Эта буферизация составляла 10-20 строк дополнительного C-кода.
Петер - Восстановить Монику
2
Нет В тот момент времени , когда он знает , что данные , которые он имеет, она больше не может использовать простой fork()/ exec()метод трубу данных через распаковывать утилиту. Утилита будет читать из stdinканала, и первые 4K теперь будут отсутствовать. После прочтения невозможно вернуть данные обратно в канал.
Кевин Панко
3
@KevinPanko: Это может быть сделано путем разветвления двух процессов, хотя в основном это эквивалентно cat buffer - | gunzip. (В качестве альтернативы можно использовать неблокирующий ввод-вывод, чтобы избежать необходимости в дополнительном процессе.)
Ильмари Каронен

Ответы:

10

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

Единственный случай, когда вам нужно указать опцию распаковки при чтении архива, это при чтении из канала или с ленточного накопителя, который не поддерживает произвольный доступ. Однако в этом случае GNU tar покажет, какую опцию вам следует использовать. Например:

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

Если вы видите такую ​​диагностику, просто добавьте предложенную опцию к вызову GNU tar:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Создание и чтение сжатых архивов

Кевин Панко
источник
2
Обратите внимание, что это работает в команде tar в OSX, но не в Linux с использованием GNU tar. Так что это можно исправить.
Шон Перри
8

Наконец, я понял, что причина, по которой я не могу позволить tar обнаруживать и распаковывать архив из stdin, заключается в том, что я использую GNU tar. BSD tar может сделать это автоматически без проблем. Поэтому я решил использовать bsdtar вместо tar в моем сценарии.

Джеймс
источник