Se você quisesse inserir outra linha no topo, seria simples.
echo some line | gzip > newfile.gz
cat newfile.gz oldfile.gz > result.gz
O gzip permite a concatenação. Se você não se importar em relatar um tamanho de arquivo descompactado errado, basta olhar para o arquivo sem descompactá-lo, ou seja. Além disso, alguns programas não podem manipular esses arquivos, WinRAR, por exemplo.
Para se aproximar do que você realmente quer, a questão é se o seu arquivo gzip é composto de blocos que funcionam inteiramente independentes um do outro e, em caso afirmativo, como encontrar o limite do bloco.
Se você sabia que queria fazer isso de antemão e criou o gzip concatenando dois arquivos gzip independentes, seria fácil resolvê-lo; no entanto, em arquivos gzip arbitrários, se isso puder ser feito, será necessário um conhecimento mais aprofundado do formato do arquivo gzip.
Eu lembro que havia um programa desse tipo para o bzip2 (mas eu esqueci o nome dele), ele criou um mapa de bloco bzip2 que permitiria acesso direto a deslocamentos específicos sem descompactar tudo o que veio antes dele.
Na linha inferior, porém, a maioria das pessoas apenas recompacta. Você provavelmente não será capaz de evitar reescrever o arquivo inteiro de qualquer forma e escrever arquivos é geralmente mais lento do que o gzip pode comprimir dados, então - se você conseguiu retirá-lo, você provavelmente pouparia alguns ciclos de CPU, mas sem tempo .
Não é uma solução para sua pergunta gzip
, mas ... não use tail
para se livrar da primeira linha, provavelmente é muito ineficiente em comparação a sed 1d
ou o que for. Não há necessidade de contar todas as linhas de um arquivo apenas para se livrar do primeiro.