Aquí hay otra solución. No le permitirá extraer archivos individuales de un archivo y reducir su tamaño, pero sí le permitirá extraer todos los archivos reduciendo el tamaño del archivo sobre la marcha:
#!/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
Guárdelo en un archivo como, p. untar_and_destroy.sh
y ejecutar como:
untar_and_destroy.sh whatever.tar.gz
Lo que esto hace es dar parte del .tar.gz
archivo a tar, le pide a Linux que desasigne esa parte del archivo y luego repite para la siguiente parte. Cuando termines, ls -l
dirá el .tar.gz
archivos tiene el mismo tamaño que antes, pero du
informará su tamaño como 0. Esto se debe a que el .tar.gz
se ha convertido en un archivo disperso, con la misma longitud que antes pero como todos los 0 que no necesitan almacenarse en el disco.
No use esto en producción, ni en ningún lugar donde eliminar ese archivo sería malo. Esto hace que el archivo sea ilegible tan pronto como se inicia, por lo que si algo sale mal, p. se queda sin espacio en el disco duro mientras extrae, no tendrá una segunda oportunidad para ejecutar esto.
Si bien puede resultar poco práctico expandir su almacenamiento principal, tal vez podría extraer el contenido del archivo a un dispositivo de almacenamiento externo.
Alternativamente, genere una lista de archivos en el archivo, luego escriba un script que extraiga algunos de ellos. Mueva esos archivos a la nube, seleccione otro lote para extraer, enjabonar, enjuagar, repetir.
Pero, todas las aplicaciones de archivo que conozco deben tener el archivo original intacto mientras crea un nuevo archivo sin lo que no desea, por lo que el almacenamiento externo será muy, muy útil.
No conozco ninguna herramienta que pueda hacer esto, y no creo que ninguno de los formatos de archivo comunes lo admita.
Una posible solución a su problema sería mantener el archivo en una máquina diferente y canalizarlo a la máquina en la que desea descomprimirlo. Por ejemplo, podría ejecutar este comando en la máquina con el archivo:
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
El archivo se transmitirá al tar
proceso que se ejecuta en el servidor, que lo descomprimirá sin necesidad de que el archivo esté presente en el servidor.