Totalmente patchwork y un boceto rápido y aproximado, pero probado en un directorio con 3000 archivos, el siguiente script hizo un trabajo extremadamente rápido:
#!/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)
Cómo utilizar
los .tar.gz
archivos numerados se crearán en el mismo directorio donde están los archivos.
Explicación
La secuencia de comandos:
- enumera todos los archivos en el directorio
- CD's en el directorio para evitar agregar la información de ruta al archivo tar
- lee la lista de archivos, agrupándolos por la división establecida
- comprime los subgrupos en archivos numerados
EDITAR
Crear automáticamente trozos por tamaño en mb
Más sofisticado es usar el tamaño máximo (en mb) de los fragmentos como (segundo) argumento. En el siguiente script, los fragmentos se escriben en un archivo comprimido tan pronto como el fragmento alcanza (pasa) el umbral.
Dado que la secuencia de comandos se desencadena por los fragmentos, que exceden el umbral, esto solo funcionará si el tamaño de (todos) los archivos es sustancialmente menor que el tamaño del fragmento.
La secuencia de comandos:
#!/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)
Correr:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... donde chunksize es el tamaño de entrada para el comando tar.
En este, se incluyen las mejoras sugeridas por @DavidFoerster. Gracias un montón !
tar
agregar todos los archivos que comienzan con un cierto patrón hasta que los tenga todos. Esto se puede programar fácilmente, pero no garantiza que el tamaño sea inferior a 9 MB según lo necesite. Sin embargo, puede ajustar manualmente el tamaño de los archivos que son demasiado grandes dividiéndolos aún más.