Nicht genügend Speicherplatz zum Entpacken der 50-GB-Datei unter Ubuntu 16.04: Kann ich die ZIP-Datei gleichzeitig extrahieren und reduzieren?

615
tyrex

Ich habe eine 50 GB-ZIP-Datei, die ungefähr 50.000 JPG-Bilder enthält. Die JPGs sind entpackt ca. 55 GB. Ich bin auf Ubuntu 16.04.

Ich habe jedoch nur 70 GB Festplattengröße auf diesem System. Ich bekomme also einen Plattenfehler in der Mitte des Entpackens.

Kann ich die Datei entpacken und gleichzeitig die Größe der ZIP-Datei reduzieren (z. B. die Daten der bereits entpackten JPGs löschen), sodass alle auf meine Festplatte passen?

--- Dieselbe Frage für Windows existiert ---

Jemand hatte genau die gleiche Frage für Windows: Entpacken Sie die Datei auf einem kleinen Laufwerk

Die dort vorgeschlagenen Lösungen lösen das Problem leider nicht für Linux (und scheinen das Problem auch unter Windows nicht zu lösen). Ich halte also diese Frage für den Fall, dass es eine gute Lösung für Linux gibt. Danke für die Kommentare.

0
@Scott Danke für den Link. Meine Frage ist genau die gleiche, nur dass ich Ubuntu anstelle von Windows betrachte. Die Antworten dort funktionieren für mich nicht (und haben das Problem für Windows auch nicht so gut gelöst). Soll ich diesen Thread schließen und dort eine Anschlussfrage stellen? Oder bewahren Sie diese auf, da es möglicherweise Ubuntu-spezifische Lösungen gibt, die funktionieren? Danke für die Rückmeldung. tyrex vor 5 Jahren 0
Behalten Sie dieses, es sei denn, jemand findet ein Duplikat mit einer Linux-Lösung. Für jetzt behalten Sie die Frage. "Follow-up question there" passt nicht zu unserem Q & A-Modell. Sie sollten ähnliche Fragen weder in Kommentaren noch in "Antworten" stellen. Kamil Maciorowski vor 5 Jahren 1
Behalten Sie einfach diesen. Vielleicht [edit], um zu sagen, dass Sie sich die andere Frage angesehen haben und Ihnen nicht weiterhelfen. Bitte entschuldigen Sie, dass Sie Ihre Frage als dup markiert haben, ohne sie sorgfältig zu lesen. Scott vor 5 Jahren 1

2 Antworten auf die Frage

0
meuh

Sie können versuchen, die Linux-spezifischen Fallocate-Systemaufrufe oder das Befehlszeilenäquivalent zu nutzen. In diesem FALLOC_FL_PUNCH_HOLEModus können Sie einen beliebigen Teil einer Datei auf Null setzen und die betroffenen Blöcke werden, sofern möglich, wieder an das Dateisystem freigegeben, wodurch eine spärliche Datei entsteht.

Nicht alle Dateisysteme unterstützen diesen Aufruf, Ext4 jedoch.

Die Idee ist, dass Sie eine Datei aus dem Archiv extrahieren und dann mit fallocate den von ihr belegten Teil des Archivs auf Null setzen. Das Wörterbuch des ZIP-Archivs enthält den Versatz zum Anfang des Kopfs jeder Datei und die komprimierte Länge der Datei innerhalb des Archivs.

Als Beispiel für das Konzept ist hier ein minimales Python3-Skript zum Extrahieren und Ausführen des Systemaufrufs für jede Datei. Sie sollten es nicht ohne sorgfältige Tests verwenden. Möglicherweise können Sie dasselbe in einem Shellskript tun, wenn Sie die Informationen extrahieren können. fallocate war für mich nicht in einer Standard-Python-Bibliothek, daher wird sie in der ersten Hälfte des Skripts mit ctypes aufgerufen. Das Skript benötigt die Python-Zipfile-Bibliothek. Es können auch andere Änderungen für Ihr System erforderlich sein. Die Höhe des Nullpunkts enthält nicht die Größe der Kopfzeile, sodass sie nicht zu einem zusammenhängenden Bereich werden.

#!/usr/bin/python3 # https://superuser.com/a/1371106/458747 # int fallocate(int fd, int mode, off_t offset, off_t len) import ctypes libc = ctypes.cdll.LoadLibrary("libc.so.6") fallocate = libc.fallocate fallocate.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.c_longlong, ctypes.c_longlong) FALLOC_FL_PUNCH_HOLE = 2 FALLOC_FL_KEEP_SIZE = 1  import sys, subprocess, zipfile # will need zlib for compression myzip = sys.argv[1] fd = open(myzip,"r+") fno = fd.fileno() zf = zipfile.ZipFile(myzip, 'r') for info in zf.infolist(): zf.extract(info) # print(info.header_offset,info.compress_size) rc = fallocate(fno, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE, info.header_offset, info.compress_size) if rc!=0: print("fallocate failed\n") subprocess.call("ls -ls "+myzip,shell=True) 

Ich habe es in einem einfachen Zip-Archiv getestet. In der ersten Spalte sehen Sie die Anzahl der Blöcke, die vom Archiv verwendet werden.

24224 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 23292 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 22524 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 21524 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip ... 2800 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 1868 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 880 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 124 -rw-r--r-- 25562742 Oct 29 22:56 ../my.zip 
0
Layne Bernardo

Sie können die integrierte GNOME- Archive ManagerDatei verwenden, um die ZIP-Datei zu öffnen, ohne sie zu extrahieren. Nach dem Öffnen können Sie ca. 10-15 GB Dateien in den Ordner kopieren, in den sie extrahiert werden sollen, und sie dann aus dem Archiv löschen. Spülen und wiederholen.

Es gibt mehrere Dienstprogramme, die über diese Funktionalität verfügen (Archive-Mounter, Archivmount, GVFS, AVFS ), aber der Archiv-Manager verfügt über eine sehr komfortable GUI und ist wahrscheinlich am einfachsten zu verwenden.

Alternativ können Sie ein externes Laufwerk anschließen und als temporären Speicher verwenden.

Randbemerkung: Windows hat die Möglichkeit, ZIP-Dateien wie diese eingebaute zu mounten. Ich bin überrascht, dass niemand im anderen Thread darauf hingewiesen hat.