Ecco un'altra soluzione. Non ti consente di estrarre singoli file da un archivio e ridurne le dimensioni, ma ti consente di estrarre tutti i file riducendo le dimensioni dell'archivio man mano che procedi:
#!/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
Salvalo in un file come ad es. untar_and_destroy.sh
ed eseguire come:
untar_and_destroy.sh whatever.tar.gz
Quello che fa è dare parte del .tar.gz
file in tar, chiede a Linux di deallocare quella parte del file, quindi ripete per la parte successiva. Quando hai finito, ls -l
dirà il .tar.gz
files ha la stessa dimensione di prima, ma du
riporterà la sua dimensione come 0. Questo perché .tar.gz
è stato trasformato in un file sparse, con la stessa lunghezza di prima ma con tutti gli 0 che non devono essere archiviati su disco.
Non usarlo in produzione o ovunque dove l'eliminazione di quell'archivio sarebbe dannoso. Ciò rende l'archivio illeggibile non appena viene avviato, quindi se qualcosa va storto, ad es. esaurisci lo spazio su disco rigido durante l'estrazione, non avrai una seconda possibilità per eseguirlo.
Anche se potrebbe non essere pratico espandere la memoria principale, forse potresti estrarre il contenuto del file su un dispositivo di archiviazione esterno.
In alternativa, genera un elenco di file nell'archivio, quindi scrivi uno script che ne estragga alcuni. Sposta quei file nel cloud, seleziona un altro batch da estrarre, insaponare, risciacquare, ripetere.
Ma ogni app di archiviazione che conosco deve avere il file di archivio originale intatto mentre crea un nuovo file di archivio senza ciò che non vuoi, quindi l'archiviazione esterna sarà molto, molto utile.
Non conosco strumenti in grado di farlo e non credo che nessuno dei formati di archiviazione comuni lo supporti.
Una possibile soluzione al tuo problema sarebbe mantenere l'archivio su una macchina diversa e inviarlo alla macchina su cui vuoi decomprimerlo. Ad esempio, puoi eseguire questo comando sulla macchina con l'archivio:
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
L'archivio verrà trasmesso al tar
processo in esecuzione sul server, che lo decomprimerà senza che sia necessario che l'archivio sia mai presente sul server.