Ich habe ein 100-GB-Laufwerk mit einer 95-GB-Datei. Ich muss Speicherplatz auf dem Laufwerk freigeben (und das Übertragen der Datei vom Laufwerk ist derzeit keine Option). Die Datei würde gut mit gzip
oder bz2
oder was auch immer komprimiert , aber alle diese Programme schreiben die komprimierte Datei in eine separate Datei. Ich habe nicht genug freien Speicherplatz dafür.
Gibt es eine Möglichkeit, die Datei mit Standardkomprimierungstools oder anderen Unix-Dienstprogrammen zu komprimieren, ohne zusätzlichen Speicherplatz zu belegen (oder zumindest einen minimalen zusätzlichen Speicherplatz)? Ich stelle mir etwas vor, das einen Teil der Datei gleichzeitig komprimiert und die Ergebnisse direkt über die Datei schreibt. Mir ist klar, dass dies riskant wäre, da die Datei beschädigt würde, wenn die Komprimierung unterbrochen würde, aber ich glaube nicht, dass ich eine Wahl habe.
quelle
Antworten:
Dies ist ein Proof-of-Concept-Bash-Einzeiler, aber es sollte Ihnen den Einstieg erleichtern. Benutzung auf eigene Gefahr.
Dies funktioniert, indem gz-Daten an einen dd-Prozess weitergeleitet werden, der sie in dieselbe Datei zurückschreibt. Nach Abschluss wird die Datei auf die Größe der gz-Ausgabe gekürzt.
Dies setzt voraus, dass die letzte Zeile der Ausgabe von dd übereinstimmt:
Wobei das erste Feld eine Ganzzahl von geschriebenen Bytes ist. Auf diese Größe muss die Datei gekürzt werden. Ich bin nicht zu 100% sicher, dass das Ausgabeformat immer dasselbe ist.
quelle
conv=notrunc
notwendig ist?gzip -c file | dd of=file
scheint genauso gut zu funktionieren.gzip
) zu irgendeinem Zeitpunkt mehr Header- und Datenbytes als die ursprünglichen Datenbytes schreibt und so einige Teile der Datei überschreibt? Ich denke, das hängt vom gewählten Komprimierungsprogramm ab. Hat jemand eine Idee, wie dies verhindert werden kann oder wie (unwahrscheinlich) es ist?Es ist nicht so sehr das
gzip
undbzip2
überschreibt das Original. Stattdessen schreiben sie die komprimierten Daten als neue Datei auf die Festplatte. Wenn dieser Vorgang erfolgreich ist, heben sie die Verknüpfung der ursprünglichen unkomprimierten Datei auf.Wenn Sie über ausreichend RAM verfügen, können Sie ein Skript schreiben, um die Dateien in einem
tmpfs
Dateisystem vorübergehend zu komprimieren. Entfernen Sie dann das Original auf der Festplatte und ersetzen Sie es durch die komprimierte Version. Vielleicht so etwas:Denken Sie nur an Ihre Speichernutzung, da
tmpfs
es sich im Wesentlichen um eine RAM-Disk handelt. Eine große Ausgabedatei kann das System leicht aushungern lassen und andere Probleme verursachen.quelle
Es gibt kein Werkzeug, das genau aus dem von Ihnen angegebenen Grund so funktioniert. Nur wenige Menschen sind bereit, ein Tool zu schreiben, das bewusst riskantes Verhalten implementiert.
quelle
Die Befehle split und csplit können verwendet werden, um die große Datei in kleinere Teile aufzuteilen und diese dann einzeln zu komprimieren. Das Zusammenbauen wäre jedoch ziemlich zeitaufwändig.
quelle