deixe o tar detectar automaticamente o tipo de compactação ao extrair do stdin

16

Eu uso o GNU tar. Ele pode detectar automaticamente o tipo de compactação ao compactar / descompactar arquivos. Mas preciso descomprimir um arquivo do stdin e o tipo de compactação é desconhecido. Notei que o alcatrão pode me dar sugestões corretas, como:

tar: Archive is compressed. Use -z option

Mas eu quero que o tar use essa opção de compactação automaticamente sem me pedir para inserir esse argumento. Como eu posso fazer isso? Por que não tar apenas descomprimir, uma vez que já conhece o tipo de compactação?

Obrigado!

James
fonte
Não foi difícil desenvolver, mas isso não é feito até agora.
peterh - Restabelece Monica
3
O motivo pelo qual não é possível fazer isso é que tarele não sabe em que tipo de dados possui stdinaté depois de lê-los e, então, é tarde demais para chamar o programa descompactado. Ele suporta gzip, bzip2 e outros. Não é fácil contornar esse problema (seria necessário armazenar em buffer os dados); portanto, é necessário que você tente novamente.
precisa
@KevinPanko Por que tarde demais? Não, não é tarde. Ele lê o primeiro 4K em um buffer, testa seu tipo de compactação (se houver) e chama o programa. Esse buffer foi de 10 a 20 linhas de código C adicional.
peterh - Restabelece Monica
2
Nesse momento em que ele sabe quais dados possui, ele não pode mais usar um método fork()/ simples exec()para canalizar os dados por meio de um utilitário descompactado. O utilitário leria do stdincanal e o primeiro 4K estaria ausente. Não há como colocar os dados de volta no tubo após a leitura.
precisa
3
@ KevinPanko: No entanto, isso poderia ser feito bifurcando dois processos, basicamente fazendo o equivalente a cat buffer - | gunzip. (Em alternativa, sem bloqueio de I / O pode ser utilizada para evitar a necessidade para o processo extra.)
Ilmari Karonen

Respostas:

10

Esta não é a resposta que você deseja ouvir, mas isso não é suportado pelo GNU tar de acordo com o manual:

O único caso em que você precisa especificar uma opção de descompactação durante a leitura do arquivo morto é ao ler de um tubo ou de uma unidade de fita que não suporta acesso aleatório. No entanto, neste caso, o GNU tar indicará qual opção você deve usar. Por exemplo:

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

Se você vir esse diagnóstico, basta adicionar a opção sugerida à chamada do tar do GNU:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Criando e lendo arquivos compactados

Kevin Panko
fonte
2
Observe que isso funciona no comando tar no OSX, mas não no Linux usando o GNU tar. Então, isso poderia ser corrigido.
Sean Perry
8

Finalmente, percebi que não posso permitir que o tar detecte e descompacte o arquivo do stdin, porque eu uso o tar do GNU. O alcatrão BSD pode fazê-lo automaticamente sem problemas. Então eu decido usar o bsdtar em vez do tar no meu script agora.

James
fonte