Aqui está outra solução. Ele não permite que você extraia arquivos individuais de um arquivo e reduza seu tamanho, mas permite que você extraia todos os arquivos reduzindo o tamanho do arquivo:
#!/bin/sh
# $1, the first paramter, is the .tar.gz file to unarchive
(
size=$(wc -c $1)
offset=0
bs=4096
while [[ $size > $offset ]]; do
dd if=$1 bs=$bs count=1 skip=$offset status=none
fallocate -p -o $offset -l $bs $1
offset=$(( $offset + $bs ))
done
) | tar xz
Salve isso em um arquivo como, por exemplo, untar_and_destroy.sh
e executar como:
untar_and_destroy.sh whatever.tar.gz
O que isto faz é dar parte do arquivo .tar.gz
para tar, pede ao Linux para desalocar essa parte do arquivo, e então repete para a próxima parte. Quando estiver pronto, ls -l
dirá que os arquivos .tar.gz
têm o mesmo tamanho de antes, mas du
informará seu tamanho como 0. Isso ocorre porque o .tar.gz
foi transformado em um arquivo esparso, com o mesmo comprimento que antes, mas como todos os 0s que não precisam ser armazenados no disco.
Não use isso na produção ou em qualquer lugar onde esse arquivo excluído seja ruim. Isso torna o arquivo ilegível assim que é iniciado, por isso, se algo der errado, por exemplo, você fica sem espaço no disco rígido enquanto extrai, você não terá uma segunda chance de executar isso.