Totalmente patchwork e um esboço rápido e atual, mas testado em um diretório com 3000 arquivos, o script abaixo fez um trabalho extremamente 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)
Como usar
os .tar.gz
arquivos numerados serão criados no mesmo diretório em que os arquivos estão.
Explicação
O script:
- lista todos os arquivos no diretório
- CDs no diretório para evitar adicionar as informações do caminho ao arquivo tar
- lê a lista de arquivos, agrupando-os pela divisão definida
- comprime o subgrupo (s) em arquivos numerados
EDITAR
Criar automaticamente pedaços por tamanho em mb
Mais sofisticado é usar o tamanho máximo (em mb) dos blocos como argumento (segundo). No script abaixo, os pedaços são gravados em um arquivo compactado assim que o pedaço atinge (passa) o limite.
Como o script é acionado pelos blocos, excedendo o limite, isso funcionará apenas se o tamanho dos arquivos (todos) for substancialmente menor que o tamanho do bloco.
O script:
#!/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)
Para correr:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... onde chunksize é o tamanho da entrada para o comando tar.
Neste, as melhorias sugeridas pelo @DavidFoerster estão incluídas. Graças muito !
tar
adicioná-los adicionando todos os arquivos começando com um determinado padrão até ter todos eles. Isso pode ser facilmente roteirizado, mas não garante que o tamanho seja menor que 9 MB, conforme necessário. No entanto, você pode ajustar manualmente o tamanho dos arquivos muito grandes, dividindo-os ainda mais.