Totalmente patchwork e um esboço rápido e aproximado, 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'python3 /path/tocompress_split.py /directory/with/files/tocompress
'.join(map(str.encode, files)))
proc.stdin.write(b'#!/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'python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
'.join(map(str.encode, files)))
proc.stdin.write(b'#!/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'python3 /path/tocompress_split.py /directory/with/files/tocompress
'.join(map(str.encode, files)))
proc.stdin.write(b'#!/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'python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
'.join(map(str.encode, files)))
proc.stdin.write(b'%pre%')
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)
')
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)
')
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)
')
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
- Salve-o em um arquivo vazio como
compress_split.py
- Na seção head, defina o número de arquivos para compactar. Na prática, sempre haverá mais um para cuidar dos poucos "restos" restantes.
-
Execute-o com o diretório com seus arquivos como argumento:
%pre%
arquivos .tar.gz
numerados serão criados no mesmo diretório onde os arquivos estão.
Explicação
O script:
- lista todos os arquivos no diretório
- cd está 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
- compacta o (s) subgrupo (s) em arquivos numerados
EDITAR
Cria automaticamente pedaços por tamanho em mb
Mais sofisticado é usar o tamanho máximo (em mb) dos fragmentos como um argumento (segundo). No script abaixo, os fragmentos são gravados em um arquivo compactado assim que o fragmento atinge (passa) o limite.
Como o script é acionado pelos fragmentos, excedendo o limite, isso só funcionará se o tamanho de todos os arquivos for substancialmente menor que o tamanho do bloco.
O script:
%pre%Para executar:
%pre%... onde chunksize é o tamanho de entrada para o comando tar.
Neste, as melhorias sugeridas por @DavidFoerster estão incluídas. Muito obrigado !