Teilen Sie Dateien mit tar, gz, zip oder bzip2 [geschlossen]

144

Ich muss eine große Datei von ca. 17-20 GB komprimieren. Ich muss es in mehrere Dateien von etwa 1 GB pro Datei aufteilen.

Ich suchte über Google nach einer Lösung und fand Wege mit splitund catBefehlen. Bei großen Dateien funktionierten sie jedoch überhaupt nicht. Außerdem funktionieren sie unter Windows nicht. Ich muss es auf einem Windows-Computer extrahieren.

Aka
quelle
3
Ich fühle deinen Schmerz, aber das scheint nicht mit der Programmierung zu tun zu haben.
Jason S
1
Viele Komprimierungsprogramme (z. B. 7-Zip) können die komprimierte Datei zur einfacheren Verteilung in Volumes einer bestimmten Größe aufteilen.
Martin Liversage
Dies gehört auf superuser.com, aber die private Beta startet erst morgen, wurde mir gesagt.
JesperE
Darf ich fragen, warum Sie diese Datei komprimieren müssen?
Jan Jungnickel
Wenn eine der beiden hier aufgeführten praktikablen Lösungen nicht funktioniert, benötigt er eine Programmierlösung.
Joshua

Antworten:

253

Sie können den splitBefehl mit der -bOption verwenden:

split -b 1024m file.tar.gz

Es kann auf einem Windows-Computer mithilfe der Antwort von @ Joshua wieder zusammengesetzt werden .

copy /b file1 + file2 + file3 + file4 filetogether

Bearbeiten : Wie @Charlie im Kommentar unten angegeben hat, möchten Sie möglicherweise ein Präfix explizit festlegen, da es xanderweitig verwendet wird, was verwirrend sein kann.

split -b 1024m "file.tar.gz" "file.tar.gz.part-"

// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

Bearbeiten : Bearbeiten des Beitrags, da die Frage geschlossen ist und die effektivste Lösung dem Inhalt dieser Antwort sehr nahe kommt:

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

Diese Lösung vermeidet die Notwendigkeit, beim (De-) Komprimieren eine große Zwischendatei zu verwenden. Verwenden Sie die Option tar -C, um ein anderes Verzeichnis für die resultierenden Dateien zu verwenden. Übrigens, wenn das Archiv nur aus einer einzigen Datei besteht, könnte tar vermieden und nur gzip verwendet werden:

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

Für Windows können Sie portierte Versionen derselben Befehle herunterladen oder cygwin verwenden.

Matpie
quelle
7
Wenn Sie kein Präfix als letztes Argument nach dem zu teilenden Dateinamen hinzufügen, erhalten Sie eine Ausgabe in Dateien mit den Namen xaa, xab, xac, xad ....
Charlie
@ Charlie, danke, ich habe meine Antwort aktualisiert.
Matpie
2
Die tatsächliche Verwendung -b 1024MiBergab den Fehler, dass es sich um eine ungültige Anzahl von Bytes handelte. Mit --bytes=1024mWerken.
Brian
Und Sie müssen nicht verwenden cat, um die Datei wieder zusammenzusetzen. Sie können copy /b file1 + file2 + etc..unter Windows verwenden, dann zurück nach Linux kopieren und tar kann den wieder zusammengesetzten Tarball lesen. Ich habe es gerade versucht.
Brian
1
Split hat die Option --numeric-suffixes: Verwenden Sie numerische Suffixe anstelle von alphabetischen.
Dr. Jan-Philip Gehrcke
27

Wenn Sie von Linux trennen, können Sie in Windows trotzdem wieder zusammenbauen.

copy /b file1 + file2 + file3 + file4 filetogether
Joshua
quelle
Sie können auch copy /b file* filetogether- support.microsoft.com/kb/71161
eug
5
Das funktioniert nur unter NTFS korrekt und wenn die Dateien bereits in der NTFS-Sortierreihenfolge vorliegen. Probieren Sie es mit FAT oder FAT32 = Boom.
Joshua
+1 Stellen Sie sicher, dass die Dateien in der richtigen Reihenfolge sind!
Brian
@Joshua Um fair zu sein, wenn nicht, hast du einen schlechten Job gemacht.
jpmc26
@ jpmc26: Sie kennen die schlechten Umordnungsgewohnheiten von FAT32, oder?
Joshua
8

Getesteter Code erstellt zunächst eine einzelne Archivdatei und teilt sie dann auf:

 gzip -c file.orig > file.gz
 CHUNKSIZE=1073741824
 PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]

 # the remainder is taken care of, for example for
 # 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
 # all of file
 for n in `seq 0 $PARTCNT`
 do
       dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
 done

Diese Variante lässt das Erstellen einer einzelnen Archivdatei aus und geht direkt zum Erstellen von Teilen über:

gzip -c file.orig |
    ( CHUNKSIZE=1073741824;
        i=0;
        while true; do
            i=$[i+1];
            head -c "$CHUNKSIZE" > "part.$i";
            [ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
        done; )

Wenn in dieser Variante die Dateigröße des Archivs durch teilbar ist $CHUNKSIZE, hat die letzte Teildatei eine Dateigröße von 0 Byte.

Adrian Panasiuk
quelle
1
Das splitmacht es schon.
Ephemient
1
ephemient Hey, ich habe einen Beitrag gegraben, der nur danach sucht. Ich habe keine Split- oder Zip-Befehle / Binärdateien auf einem bestimmten Gerät, und dieses hat perfekt funktioniert. Ich werde diesen Code so vorbereiten, dass er als Split-Befehl funktioniert :). Vielen Dank @Adrian Panasiuk. Das ist perfekt für mich.
m3nda
@ erm3nda Gern geschehen, froh, dass es hilft!
Adrian Panasiuk
Aber ich habe getestet und das Ergebnis war eine vollständige Datei, nicht geteilt. Wie kann es sein? War eine große Datei auf einem kleinen Gerät, so war ein langer Prozess. Bitte testen Sie Ihre Lösungen beim Posten :(
m3nda
@ erm3nda Du hast uns nie gesagt, dass du es vermeiden musst, eine temporäre Datei zu erstellen! Bitte siehe zweite Variante!
Adrian Panasiuk