Повністю печворк та швидкий, грубий ескіз, як це є, але протестований у каталозі з 3000 файлами, сценарій нижче зробив надзвичайно швидку роботу:
#!/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)
Як використовувати
нумеровані .tar.gz
файли будуть створені в тому самому каталозі, де і файли.
Пояснення
Сценарій:
- перераховує всі файли в каталозі
- CD в каталог, щоб не додати інформацію про шлях до файлу tar
- читає список файлів, групуючи їх за заданим поділом
- стискає підгрупу (групи) до нумерованих файлів
EDIT
Автоматично створювати шматки за розміром в mb
Більш складним є використання максимального розміру (в mb) фрагментів як (другого) аргументу. У нижченаведеному сценарії шматки записуються в стислий файл, як тільки шматок досягає (переходить) поріг.
Оскільки сценарій спрацьовує шматки, перевищуючи поріг, це буде працювати лише в тому випадку, якщо розмір (усіх) файлів істотно менший за розмір фрагмента.
Сценарій:
#!/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)
Бігти:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... де chunksize - розмір вводу для команди tar.
У цьому включені запропоновані удосконалення від @DavidFoerster. Спасибі велике !
tar
, додавши всі файли, починаючи з певного шаблону, поки у вас їх немає. Це можна легко прописати, але не гарантує, що розмір буде меншим, ніж вам потрібно, 9 Мб. Однак ви можете вручну налаштувати розмір файлів, які є занадто великими, розділивши їх далі.