Wie erstelle ich ein geteiltes Teerarchiv in mehreren Schritten, um Platz zu sparen?

Jan 08 2021

Ich habe einen sehr großen Ordner, von dem ich ein Teerarchiv erstellen möchte. Das Problem ist, dass ich nicht genug zusätzlichen freien Speicherplatz habe, um das gesamte Archiv zu speichern. Daher möchte ich beispielsweise 100 bis 200 GB große Teile des Archivs gleichzeitig erstellen und diese einzeln in den Cloud-Speicher übertragen. Ich muss in der Lage sein zu steuern, wann neue Blöcke erstellt werden, damit meine Festplatte nicht voll wird, aber alle Befehle, die ich zum Erstellen von geteilten Tarballs gefunden habe, erstellen immer alles auf einmal im selben Verzeichnis.

Die naheliegendste Lösung, die ich gefunden habe, war diese Frage, aber alle Antworten basieren auf der Anzahl der Dateien, nicht auf der Größe, die für meinen Anwendungsfall wichtig ist, da meine Dateigrößen ungleich verteilt sind.

Antworten

2 EduardoTrápani Jan 08 2021 at 10:09

Sie können tarmit diesen Optionen Benutzer :

--new-volume-script=COMMAND
--tape-length=N

Am Ende jedes Volumes wird Ihr Skript aufgerufen, das einige Umgebungsvariablen enthält, um zu wissen, welches Volume gerade verarbeitet wurde. Auf der Handbuchseite finden Sie die vollständige Liste, aber zumindest die Variable TAR_VOLUME ist sehr nützlich, falls Sie die Ausgabedatei umbenennen oder das aktuelle Volume irgendwie verfolgen müssen:

TAR_VOLUME Ordnungszahl des zu verarbeitenden Volume-Tar (festgelegt, wenn ein Archiv mit mehreren Volumes gelesen wird).

Wenn die Skriptrückgabe 0 tarfortgesetzt wird, wird sie andernfalls gestoppt.

Auf diese Weise wird beispielsweise jedes Volume mit einer maximalen Größe von 20 MB erstellt und Ihr Skript jedes Mal aufgerufen, wenn das Limit erreicht ist:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

Das Skript kann einfach sein echo "Next volume";readoder Sie können sogar die Übertragung von ihm durchführen (das Umbenennen des Volumes, da es nach dem Beenden /tmp/volume.tarüberschrieben wird).

Verwenden Sie auf der anderen Seite unbedingt das Flag --multi-volume. Wenn Sie dies nicht tun, hört tar mit den Fehlern auf (ich lasse es, falls jemand nach dem Fehler sucht):

tar: Unerwarteter EOF im Archiv

tar: Fehler kann nicht behoben werden: Beendet jetzt

tar xvf /path/to/transferred.volume --multi-volume

Bereiten Sie Volume 2 für /path/to/transferred.volume vor und drücken Sie die Eingabetaste:

tarfordert Sie zur Eingabe des neuen Volumes auf. Sobald Sie die Eingabetaste drücken, /path/to/transferred.volumewird erneut geöffnet und so weiter.

1 JoshHarrison Jan 09 2021 at 01:30

Nach der hervorragenden Antwort von eduardo-trápani finden Sie unten eine leicht modifizierte Version eines Skripts auf der GNU-Seite , das auf Benutzereingaben für jedes Volume wartet und erneut versucht, wenn kein Volume gefunden wird:

Der Vollständigkeit halber ist dies der Befehl zum Erstellen des Archivs:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

Und dies ist der Befehl, mit dem ich das geteilte Archiv extrahiert habe:

tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh

myscript.sh:

#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo "Press enter to continue to next volume"

read

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

Bearbeiten: Dies funktioniert nur mit GNU Tar, das unter macOS (mit Homebrew) installiert werden kann durch:

brew install gnu-tar

Um es als Standardteer zu verwenden, müssen Sie es wie folgt zu Ihrem Pfad hinzufügen:

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"