Ich bin auf Ubuntu 16.04.
Ich habe einen Ordner mit vielen Textdateien (fast 12 KB). Ich muss sie alle auf eine Website hochladen, die .tar.gz
Uploads akzeptiert und sie dann automatisch dekomprimiert, aber ein Limit von 10 MB (10000 KB) pro Datei hat (daher muss insbesondere jede Datei für sich dekomprimiert werden). Wenn ich tar.gz
alle diese Dateien habe, ist die resultierende Datei von etwa 72 MB.
Was ich tun möchte, ist, acht .tar.gz
Dateien zu erstellen , deren Größe / Dimension (streng) kleiner als 10000 KB ist.
Alternativ kann man davon ausgehen, dass alle oben genannten Dateien ungefähr die gleiche Dimension haben. Daher möchte ich acht .tar.gz
Dateien mit jeweils mehr oder weniger der gleichen Anzahl von Dateien erstellen.
Wie kann ich eine dieser beiden Aufgaben ausführen?
Ich bin vollkommen in Ordnung mit einer Lösung, die GUI, CLI oder Scripting beinhaltet. Ich bin hier nicht auf der Suche nach Geschwindigkeit, ich muss es nur tun.
quelle
tar
hinzufügen, indem Sie alle Dateien hinzufügen, die mit einem bestimmten Muster beginnen, bis Sie alle haben. Dies kann einfach per Skript ausgeführt werden, garantiert jedoch nicht, dass die Größe bei Bedarf unter 9 MB liegt. Sie können die Größe der zu großen Dateien jedoch manuell anpassen, indem Sie sie weiter aufteilen.Antworten:
Völlig Patchwork und eine schnelle, grobe Skizze wie sie ist, aber in einem Verzeichnis mit 3000 Dateien getestet, hat das folgende Skript einen extrem schnellen Job gemacht:
Wie benutzt man
compress_split.py
Führen Sie es mit dem Verzeichnis mit Ihren Dateien als Argument aus:
nummerierte
.tar.gz
Dateien werden in demselben Verzeichnis erstellt, in dem sich die Dateien befinden.Erläuterung
Das Skript:
BEARBEITEN
Erstellen Sie automatisch Chunks nach Größe in MB
Anspruchsvoller ist es, die maximale Größe (in MB) der Chunks als (zweites) Argument zu verwenden. Im folgenden Skript werden die Chunks in eine komprimierte Datei geschrieben, sobald der Chunk den Schwellenwert erreicht (überschreitet).
Da das Skript von den Chunks ausgelöst wird und den Schwellenwert überschreitet, funktioniert dies nur, wenn die Größe (aller) Dateien wesentlich kleiner als die Chunk-Größe ist.
Das Skript:
Laufen:
... wobei Chunksize die Größe der Eingabe für den Befehl tar ist.
In diesem sind die vorgeschlagenen Verbesserungen von @DavidFoerster enthalten. Dank viel !
quelle
tar
Aufruf weiter zu verbessern, indem ich die Dateiliste im Standardeingabestream bereitstelle.tar
können Sie Dateien angeben, die bei Standardeingaben mit einer geeigneten Option hinzugefügt (oder extrahiert) werden sollen.Ein reiner Shell-Ansatz:
Erläuterung
files=(*)
: Speichern Sie die Liste der Dateien (auch Verzeichnisse, falls vorhanden, ändern Sie infiles=(*.txt)
, um nur Dinge mit einertxt
Erweiterung zu erhalten) im Array$files
.num=$((${#files[@]}/8));
:${#files[@]}
ist die Anzahl der Elemente im Array$files
. Das$(( ))
ist Bashs (begrenzte) Art zu rechnen. Dieser Befehl setzt also$num
die Anzahl der Dateien geteilt durch 8.k=1
: nur ein Zähler, um die Tarballs zu benennen.for ((i=0; i<${#files[@]}; i+=$num)); do
: iteriere über die Werte des Arrays.$i
wird bei0
(dem ersten Element des Arrays) initialisiert und um erhöht$num
. Dies wird fortgesetzt, bis wir alle Elemente (Dateien) durchlaufen haben.tar cvzf files$i.tgz -- ${files[@]:$i:$num}
: In Bash können Sie ein Array-Slice (Teil eines Arrays) mit erhalten. Es${array[@]:start:length}
werden also${array[@]:2:3}
drei Elemente ab dem zweiten zurückgegeben. Hier nehmen wir ein Slice, das beim aktuellen Wert von beginnt$i
und$num
Elemente lang ist. Dies--
wird für den Fall benötigt, dass einer Ihrer Dateinamen mit a beginnen kann-
.((k++))
: Zuwachs$k
quelle