Esta é uma prova de conceito bash one-liner, mas deve começar. Use a seu próprio risco.
truncate -s 'gzip -c file | dd of=file conv=notrunc 2>&1 | sed -n '$ s/ .*$// p'' file
mv file file.gz
Isso funciona canalizando os dados gz para um processo dd que o escreve de volta no mesmo arquivo. Após a conclusão, o arquivo é truncado para o tamanho da saída gz.
Isso pressupõe que a última linha da saída de dd corresponde:
4307 bytes (4.3 kB) copied, 2.5855e-05 s, 167 MB/s
Onde o primeiro campo é um inteiro de bytes escritos. Este é o tamanho que o arquivo precisará ser truncado. Não tenho 100% de certeza de que o formato de saída é sempre o mesmo.