Wie kann man eine TAR-Datei an Dateigrenzen in kleinere Teile aufteilen?

8

Ich habe eine TAR-Datei, die ich in mehrere kleinere TAR-Dateien aufteilen möchte. Dies wäre einfach split, aber ich möchte, dass die aufgeteilten Dateien selbst vollständig verwendbare TAR-Dateien sind, was splitnicht möglich ist, da sie an beliebigen Punkten und nicht an Dateigrenzen aufgeteilt werden.

Wie kann man eine TAR-Datei an den Dateigrenzen in kleinere Teile aufteilen, sodass keine Datei zur Hälfte in einem Teer und zur Hälfte im anderen Teer liegt?

Lösungen, die keinen Teer verwenden und die Aufgabe auf andere Weise erfüllen, wären ebenfalls willkommen.

PS: Ja, es wird Fälle geben, in denen dies nicht möglich ist (Teer mit Dateien, die größer als die geteilte Größe sind).

Grumbel
quelle
[ star ] ( cdrecord.berlios.de/private/man/star/star.1.html ) hat eine vielversprechende Option tsize=, aber ich habe nichts wie [ bsdtar ] ( code.google.com/p/libarchive/wiki) gesehen / ManPageBsdtar1 ) @archive, die die Aufgabe möglicherweise abschließen.
Chris Johnsen

Antworten:

1

Es gibt ein Tool, tarsplitterdas Teerarchive sicher aufteilt. Sie geben die Anzahl der Teile an, in die Sie das Archiv aufteilen möchten, und es wird ermittelt, wo sich die Dateigrenzen befinden.

https://github.com/AQUAOSOTech/tarsplitter

Die kleineren Ausgabearchive haben nicht genau die gleiche Größe, sind aber ziemlich nahe beieinander - vorausgesetzt, die Dateien im Originalarchiv weisen keine großen Unterschiede auf.

Beispiel - Teilen Sie das Archiv "files.tar" in 4 kleinere Archive auf:

tarsplitter -p 4 -i files.tar -o /tmp/parts

Erstellen:

/tmp/parts0.tar
/tmp/parts1.tar
/tmp/parts2.tar
/tmp/parts3.tar
Ruffrey
quelle
3

Wenn die Neuerstellung des Archivs eine Option ist, sollte dieses Bash-Skript den Trick ausführen (dies ist nur eine mögliche Methode):

#! / bin / bash

if [$ #! = 3]; dann
    echo -e "$ 0 in out max \ n"
    echo -e "\ tin: Eingabeverzeichnis"
    echo -e "\ tout: Ausgabeverzeichnis"
    echo -e "\ tmax: Schwellenwert für geteilte Größe in Bytes"
    Ausfahrt
fi

IN = $ 1 OUT = $ 2 MAX = $ 3 SEQ = 0 TOT = 0
finde $ IN-Typ f |
während ich lese; do du -bs "$ i"; erledigt |
sort -n |
während Sie SIZE NAME lesen; tun
    if [$ TOT! = 0] && [$ ((TOT + SIZE)) -gt $ MAX]; dann
        SEQ = $ ((SEQ + 1)) TOT = 0
    fi
    TOT = $ ((TOT + GRÖSSE))
    TAR = $ OUT / $ (printf '% 08d' $ SEQ) .tar
    tar rf $ TAR "$ NAME"
erledigt

Es sortiert (in aufsteigender Reihenfolge) alle Dateien nach Größe und beginnt mit der Erstellung der Archive. Es wechselt zu einem anderen, wenn die Größe den Schwellenwert überschreitet.

HINWEIS: Stellen Sie sicher, dass das Ausgabeverzeichnis leer ist.

BENUTZUNG AUF EIGENE GEFAHR

cYrus
quelle
1

Ich glaube nicht, dass es dafür Tools gibt, aber es wäre ziemlich einfach, sich selbst zu implementieren. Das Teerformat ist ziemlich einfach, so dass Sie nur ein Format benötigen split, das dies berücksichtigt. Die grundlegende Theorie besteht darin, einen Header zu lesen, die angegebene Länge der eingehenden Datei zu überprüfen und zu bestimmen, ob jetzt geteilt oder die aktuelle Datei ausgeschrieben werden soll. Lesen Sie den nächsten Header und wiederholen Sie den Vorgang.

tylerl
quelle
libarchive könnte für so etwas nützlich sein.
Chris Johnsen
1

Der tarsplittervon @ruffrey angebotene Befehl scheint eine großartige Option zu sein.
Ich habe es heruntergeladen und dann:

brew install golang

um es kompilieren zu können. (Hmm ... ist es bereits in Homebrew? Nein.) Der Befehl wurde auf meinem Mac unter 10.14 erfolgreich kompiliert. Ich mache gerade eine Kopie meines gigantischen Archivs, um tarsplitterdagegen zu laufen . Zwei Daumen hoch für die Empfehlung.

Ich bin ein relativer Neuling, wenn es darum geht, den Code anderer Leute zu kompilieren. Daher wäre es hilfreich gewesen, wenn der Autor klargestellt hätte, dass er in GO anstelle von C / C ++ geschrieben wurde und einen neuen Compiler installiert haben musste. Funktioniert auch make installnicht, da es keine Installation im gibt Makefile, also habe ich es einfach gemacht:

cp build/tarsplitter_mac /usr/local/bin/tarsplitter

Schön, dass der GO-Compiler für Mac, Linux und Windows gebaut wurde.

EuGH
quelle