Абсолютно лоскутная работа и быстрый, грубый набросок, как он есть, но протестированный на каталоге с 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
- читает список файлов, группируя их по заданному разделению
- сжимает подгруппу (ы) в пронумерованные файлы
РЕДАКТИРОВАТЬ
Автоматически создавать куски по размеру в мб
Более сложным является использование максимального размера (в мб) кусков в качестве (второго) аргумента. В приведенном ниже сценарии чанки записываются в сжатый файл, как только чанк достигает (проходит) пороговое значение.
Поскольку сценарий запускается порциями, превышающими пороговое значение, это будет работать только в том случае, если размер (всех) файлов существенно меньше размера порции.
Сценарий:
#!/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 МБ, как вам нужно. Однако вы можете вручную отрегулировать размер слишком больших файлов, разделив их дальше.