Hier ist eine andere Lösung. Es lässt Sie nicht einzelne Dateien aus einem Archiv extrahieren und seine Größe reduzieren, aber es lässt Sie alle Dateien extrahieren und dabei die Größe des Archivs reduzieren:
#!/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
Speichern Sie dies in eine Datei wie z.B. untar_and_destroy.sh
und ausführen als:
untar_and_destroy.sh whatever.tar.gz
Dadurch wird ein Teil von .tar.gz
angegeben file to tar, fordert Linux auf, diesen Teil der Datei freizugeben, und wiederholt dann den nächsten Teil. Wenn Sie fertig sind, ls -l
sagt die .tar.gz
Dateien hat die gleiche Größe wie zuvor, aber du
meldet seine Größe als 0. Das liegt daran, dass .tar.gz
wurde in eine Sparse-Datei umgewandelt, mit der gleichen Länge wie zuvor, aber mit allen Nullen, die nicht auf der Festplatte gespeichert werden müssen.
Verwenden Sie dies nicht in der Produktion oder überall dort, wo es schlecht wäre, dieses Archiv zu löschen. Dadurch wird das Archiv unlesbar, sobald es gestartet wird. Wenn also etwas schief geht, z. Wenn Ihnen beim Extrahieren der Festplattenspeicher ausgeht, erhalten Sie keine zweite Chance, dies auszuführen.
Obwohl es unpraktisch sein kann, Ihren Primärspeicher zu erweitern, könnten Sie den Dateiinhalt vielleicht auf ein externes Speichergerät extrahieren.
Alternativ können Sie eine Liste der Dateien im Archiv erstellen und dann ein Skript schreiben, das einige davon extrahiert. Verschieben Sie diese Dateien in die Cloud, wählen Sie einen anderen Stapel zum Extrahieren aus, schäumen Sie, spülen Sie, wiederholen Sie.
Aber jede Archivierungs-App, die ich kenne, muss die ursprüngliche Archivdatei intakt haben, während sie eine neue Archivdatei ohne das erstellt, was Sie nicht wollen, also wird ein externer Speicher sehr, sehr nützlich sein.
Mir ist kein Tool bekannt, das dies kann, und ich glaube nicht, dass dies von den gängigen Archivierungsformaten unterstützt wird.
Eine mögliche Lösung für Ihr Problem wäre, das Archiv auf einem anderen Computer zu speichern und es an den Computer weiterzuleiten, auf dem Sie es dekomprimieren möchten. Sie könnten beispielsweise diesen Befehl auf dem Computer mit dem Archiv ausführen:
cat archive.tar.gz | ssh YOUR_SERVER tar xfz -
Das Archiv wird zum tar
gestreamt Prozess, der auf dem Server läuft, der es dekomprimieren wird, ohne dass das Archiv jemals auf dem Server vorhanden sein muss.