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:
#!/usr/bin/env python3
import subprocess
import os
import sys
splitinto = 2
dr = sys.argv[1]
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
size = n_files // splitinto
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1
for f in files:
sub.append(f)
if len(sub) == size:
compress(tar, sub)
sub = []; tar += 1
if sub:
# taking care of left
compress(tar, sub)
Wie benutzt man
nummerierte .tar.gz
Dateien werden in demselben Verzeichnis erstellt, in dem sich die Dateien befinden.
Erläuterung
Das Skript:
- listet alle Dateien im Verzeichnis auf
- CDs in das Verzeichnis, um zu verhindern, dass die Pfadinformationen zur TAR-Datei hinzugefügt werden
- Liest die Dateiliste durch und gruppiert sie nach der eingestellten Abteilung
- Komprimiert die Untergruppe (n) in nummerierte Dateien
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:
#!/usr/bin/env python3
import subprocess
import os
import sys
dr = sys.argv[1]
chunksize = float(sys.argv[2])
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1; subsize = 0
for f in files:
sub.append(f)
subsize = subsize + (os.path.getsize(f)/1000000)
if subsize >= chunksize:
compress(tar, sub)
sub = []; tar += 1; subsize = 0
if sub:
# taking care of left
compress(tar, sub)
Laufen:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... wobei Chunksize die Größe der Eingabe für den Befehl tar ist.
In diesem sind die vorgeschlagenen Verbesserungen von @DavidFoerster enthalten. Dank viel !
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.