Não.
Tar é uma concatenação de dados de arquivos, intercalados com metadados de arquivos (cabeçalhos de tarts). Isso por si só não seria necessariamente o beco sem saída, já que se poderia ler o cabeçalho, descobrir o comprimento dos dados e (se o servidor permitisse isso) pular para o próximo cabeçalho (por exemplo, através da mesma funcionalidade que permite retomar as transmissões HTTP).
O que realmente dificulta isso é a compressão - os dados descompactados geralmente dependem dos precedentes, portanto em tudo que o precede. Agora, para bzip2 tudo é um bloco de 100kB a 900kB (com 100kB etapas IIUC). Assim, seu algoritmo teria que:
-
obtenha o início do arquivo;
-
leia o comprimento do fragmento descomprimido L no cabeçalho;
-
descompacte o bloco - isso significa fazer o download dos dados conforme necessário, até o final do o bloco bz2 é alcançado;
-
verifique o cabeçalho tar e os tamanhos H do cabeçalho tar do primeiro arquivo e D de seus dados;
-
pule para o próximo arquivo: ele está no bloco decodificado ( H + D L ) ou compactado adicional os dados precisam ser buscados ( H + D > L ). E é exatamente aí que ele quebra - se eu entendi o formato bzip2 corretamente, o cabeçalho não contém o comprimento do bloco comprimido (somente descompactado). Portanto, se você precisar buscar outro bloqueio, não será possível procurar no fluxo, mesmo que o meio subjacente tenha permitido isso.
Resumo: se você puder negociar a mudança de formato para algo que contenha tamanho de bloco compactado em seu cabeçalho, isso poderá ser solucionado. Por outro lado, um arquivo tar 24GB comprimido é um formato bastante insano para distribuição de qualquer coisa - é um BD de camada única e não acho que uma pessoa razoável pensaria em compactar o conteúdo para ir em um disco em um único arquivo, em vez de dividi-lo em partes de no máximo 1-2 GB de tamanho. Então, se a negociação for possível, tente perguntar sobre isso (dividindo-a em pedaços menores).
Outra coisa que poderia ajudá-lo um pouco seria obter a lista de arquivos em conjunto com os tamanhos de arquivo separadamente - isso permitiria que você fizesse pelo menos alguns palpites sobre o que fazer download (e você sempre pode obter os defeitos se necessário) ). Essa lista pode ser produzida facilmente - apenas redirecionando o stdout detar
para um arquivo:
tar cvv all_the_uncompressed_gigabytes 2>list.txt | bzip2 -9 > data.tar.bz2