You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将大tar.gz文件分割为单个可读取的1GB以内有效tar.gz文件?

实现方法

Shell 脚本实现

直接截断 tar.gz 文件会导致子文件失效,因此需要将原归档内的文件分批重新打包为独立的有效 tar.gz 文件,确保每个子文件大小不超过1GB。

步骤1:生成原归档的文件列表

先通过 tar 命令列出原归档内的所有文件,保存到临时文件:

tar tf archive.tar.gz > file_list.txt

步骤2:分批打包脚本

创建以下Shell脚本(命名为 split_tar.sh):

#!/bin/bash

SOURCE_TAR="archive.tar.gz"
MAX_SIZE=$((1024*1024*1024))  # 1GB,可调整为950MB避免偏差
COUNTER=0
CURRENT_TAR="archive_${COUNTER}.tar.gz"
CURRENT_SIZE=0

# 初始化第一个归档
touch "$CURRENT_TAR"

while read -r FILE; do
    # 获取当前文件在归档中的未压缩大小
    FILE_SIZE=$(tar tzf "$SOURCE_TAR" "$FILE" | awk '{print $3}')
    # 判断加入当前文件是否超过大小限制
    if [ $((CURRENT_SIZE + FILE_SIZE)) -gt $MAX_SIZE ]; then
        COUNTER=$((COUNTER + 1))
        CURRENT_TAR="archive_${COUNTER}.tar.gz"
        CURRENT_SIZE=0
        touch "$CURRENT_TAR"
    fi
    # 从原归档提取文件并添加到当前子归档
    tar zrf "$CURRENT_TAR" --file "$SOURCE_TAR" "$FILE"
    CURRENT_SIZE=$((CURRENT_SIZE + FILE_SIZE))
done < file_list.txt

# 清理临时文件
rm file_list.txt

执行说明

给脚本添加执行权限后运行:

chmod +x split_tar.sh
./split_tar.sh

Python 实现

使用Python内置的 tarfile 模块读取原归档,分批写入新的 tar.gz 文件,精准控制子文件大小。

代码实现

import tarfile

SOURCE_TAR = "archive.tar.gz"
MAX_SIZE = 1024 * 1024 * 1024  # 1GB,可按需调整
counter = 0
current_tar_path = f"archive_{counter}.tar.gz"
current_size = 0

with tarfile.open(SOURCE_TAR, 'r:gz') as source_tar:
    current_tar = tarfile.open(current_tar_path, 'w:gz')
    for member in source_tar.getmembers():
        # 跳过目录,目录本身不占有效存储
        if member.isdir():
            continue
        # 检查加入当前文件是否超出大小限制
        if current_size + member.size > MAX_SIZE:
            current_tar.close()
            counter += 1
            current_tar_path = f"archive_{counter}.tar.gz"
            current_tar = tarfile.open(current_tar_path, 'w:gz')
            current_size = 0
        # 将原归档中的文件添加到当前子归档
        file_content = source_tar.extractfile(member)
        current_tar.addfile(member, file_content)
        current_size += member.size
    # 关闭最后一个子归档
    current_tar.close()

注意事项

  • 上述代码按文件未压缩大小计算阈值,压缩后的子文件实际会远小于1GB;若需严格控制压缩后的大小,可在每次添加文件后检查当前子归档的磁盘占用,调整分批逻辑。
  • 若原归档内存在单个文件超过1GB的情况,该文件无法被分割,需单独处理这类超大文件。

内容的提问来源于stack exchange,提问作者user5123481566

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:35:12