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 à medida que você vai:
#!/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
Salvar isso em um arquivo como, por exemplo, untar_and_destroy.sh
e execute como:
untar_and_destroy.sh whatever.tar.gz
O que isto faz é dar parte do .tar.gz
file to tar, pede ao Linux para desalocar essa parte do arquivo, e então repete para a próxima parte. Quando tiver terminado, ls -l
vai dizer o .tar.gz
arquivos tem o mesmo tamanho de antes, mas du
irá relatar seu tamanho como 0. Isso ocorre porque o .tar.gz
foi transformado em um arquivo esparso, com o mesmo tamanho de 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.