Não será rápido, especialmente para um tarball grande com muitos arquivos, mas no bash você pode fazer isso:
tar -tzf tarball.tgz | while IFS= read -r file; do
tar --no-recursion -xzf tarball.tgz -- "$file"
gzip -- "$file"
done
O primeiro comando tar extrai os nomes dos arquivos no tarball e passa esses nomes para um loop while read ...
. O nome do arquivo é então passado para um segundo comando tar que extrai apenas esse arquivo , que é então compactado antes que o próximo arquivo seja extraído. O --no-recursion
flag é usado, portanto, tentar extrair um diretório não extrai todos os arquivos desse diretório, que é o que o tar faria normalmente.
Você ainda precisará de espaço livre suficiente para armazenar um pouco mais do que o tamanho original do tarball compactado.