为了账号安全,请及时绑定邮箱和手机立即绑定

按文件数拆分 gzip 文件

按文件数拆分 gzip 文件

一只名叫tom的猫 2022-03-09 21:07:21
我有一个包含数百万个 xml 文件的大型 tar.gz 文件。splitlinux中的命令可以按字节数/行数拆分,但不能按文件数拆分。例如,我想将 gzip 文件拆分为每个输出子 gzip 中的 300k 个文件。是否有实用程序来实现这一目标?我的最终目标是在 Python 中处理 tar.gz,我需要将文件拆分成更小的块来保留文件。拆分将允许并行处理它们。
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

因为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)


查看完整回答
反对 回复 2022-03-09
  • 1 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信