Я использую GNU tar. Он может автоматически определять тип сжатия при сжатии / распаковке файлов. Но мне нужно распаковать архив из stdin и тип сжатия неизвестен. Я заметил, что tar может дать мне правильное предложение вроде:
tar: Archive is compressed. Use -z option
Но я хочу, чтобы tar использовал эту опцию сжатия автоматически, без запроса ввода этого аргумента. Как я могу это сделать? Почему бы просто не распаковать tar, поскольку он уже знает тип сжатия?
Спасибо!
tar
он не знает, к какому типу данных он относится, stdin
до тех пор, пока не прочитает их, и к тому времени уже слишком поздно вызывать программу распаковки. Он поддерживает gzip, bzip2 и другие. Обойти эту проблему нелегко (придется буферизовать данные), поэтому он просто говорит вам попробовать еще раз.
fork()
/ exec()
метод трубу данных через распаковывать утилиту. Утилита будет читать из stdin
канала, и первые 4K теперь будут отсутствовать. После прочтения невозможно вернуть данные обратно в канал.
cat buffer - | gunzip
. (В качестве альтернативы можно использовать неблокирующий ввод-вывод, чтобы избежать необходимости в дополнительном процессе.)