Разделить файл gzip по количеству файлов - PullRequest
0 голосов
/ 20 июня 2019

У меня есть большой файл tar.gz, который содержит миллионы XML-файлов.

Команда

split в linux может делиться на количество кусков / строк, но не может делиться на количество файлов . Я хотел бы, например, разделить файл gzip, скажем, по 300 тыс. Файлов в каждом выходном суб-gzip. Есть ли утилита для этого?

Моя конечная цель - обработать tar.gz в Python, и мне нужно разбить файл на более мелкие куски, сохранив файлы. Расщепление позволит обрабатывать их параллельно.

1 Ответ

0 голосов
/ 20 июня 2019

Поскольку split не поддерживает разбиение по количеству файлов, я реализовал утилиту Python:

import tarfile
import glob
import os
import shutil 

def make_a_split(input_dir, split_num):
    print("split {}".format(split_num))
    tar_output = tarfile.open("split_" + str(split_num) + ".tar.gz", "w:gz")
    for file_name in glob.glob(os.path.join(input_dir, "*")):
        #print("  Adding %s..." % file_name)
        tar_output.add(file_name, os.path.basename(file_name))
    tar_output.close()
    shutil.rmtree(tmp_output_dir)
    print("split {} done".format(split_num))

count_per_split = 300000
split = 1

tmp_output_dir = "tmp/"

tar = tarfile.open('your.tar.gz')

for idx, tarinfo in enumerate(tar):
    tar.extract(tarinfo, tmp_output_dir)
    if idx > 0 and idx % count_per_split == 0:
       make_a_split(tmp_output_dir, split)
       split += 1
tar.close()
# did we not remove the temp dir? It means we have seen less than count_per_split and need
# to make a split
if os.path.exists(tmp_output_dir):
   make_a_split(tmp_output_dir, split)
...