如何将大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
相关产品推荐
相关产品推荐

