Totalmente patchwork e uno schizzo rapido e approssimativo, ma testato su una directory con 3000 file, lo script seguente ha fatto un lavoro estremamente veloce:
#!/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)
Come usare
i .tar.gz
file numerati verranno creati nella stessa directory in cui si trovano i file.
Spiegazione
Il copione:
- elenca tutti i file nella directory
- cd è nella directory per impedire l'aggiunta delle informazioni sul percorso al file tar
- legge l'elenco dei file, raggruppandoli per la divisione impostata
- comprime i sottogruppi in file numerati
MODIFICARE
Crea automaticamente blocchi per dimensione in mb
Più sofisticato è usare la dimensione massima (in mb) dei blocchi come (secondo) argomento. Nello script seguente, i blocchi vengono scritti in un file compresso non appena il blocco raggiunge (supera) la soglia.
Poiché lo script viene attivato dai blocchi, superando la soglia, questo funzionerà solo se la dimensione di (tutti) i file è sostanzialmente inferiore alla dimensione del blocco.
Il copione:
#!/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)
Correre:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... dove chunksize è la dimensione dell'input per il comando tar.
In questo, sono inclusi i miglioramenti suggeriti da @DavidFoerster. Grazie mille !
tar
aggiungerli tutti iniziando con un certo schema fino a quando non li avrai tutti. Questo può essere facilmente scritto ma non garantisce che le dimensioni saranno inferiori a 9 MB di cui hai bisogno. Tuttavia, è possibile regolare manualmente le dimensioni di quei file troppo grandi suddividendoli ulteriormente.