tar 本身不支持分卷打包,但可通过 tar -c | split 实现流式均等切割;使用 -zcf - 输出到 stdout,split 以 -b 指定大小、-d -a 设置数字后缀,确保各分片大小严格一致(末片略小)。

直接用 tar 命令本身无法生成“均等小物理卷”,它不支持原生分卷打包(如 Windows 的 ZIP 分卷)。但通过 tar + split 流式管道,可以实现“逻辑上均等、物理上连续”的切割效果——即压缩流实时切片,每个分片大小严格可控,适合上传限制场景。
用 tar -c | split 实现流式均等切割
这是最常用、最可靠的方式:tar 打包输出到标准输出(-),不落地为完整压缩包,直接交给 split 切割。所有分片大小严格一致(最后一片可能略小)。
-
基本命令:
tar -zcf - /path/to/dir | split -b 500M -d -a 3 myarchive.tar.gz. -
-zcf -表示 gzip 压缩并输出到 stdout;-是 split 的输入源(表示从 stdin 读) -
-b 500M每片固定 500MB(单位支持 K/M/G/B) -
-d -a 3后缀用数字(000, 001, 002…),长度为 3 位,避免字母序列歧义 - 输出文件名形如:
myarchive.tar.gz.000、myarchive.tar.gz.001…
按文件列表精准打包再切割(适合海量小文件)
当要打包的文件数量极多、路径含空格或特殊字符时,推荐先生成文件列表,再用 --files-from 控制输入,避免 shell 展开错误。
- 生成安全列表:
find /data/audio -type f -name "*20260721*.mp3" -print0 > filelist.txt - 打包+切割(支持 null 字符分隔):
tar -zcf - --null --files-from filelist.txt | split -b 1G -d -a 4 upload_20260721.gz. -
--null和-print0配合,确保含空格/换行的路径不被截断
验证切割是否完整可用
切割后务必验证可还原性,避免传输中断或损坏导致解压失败。
- 合并并解压(不落地):
cat upload_20260721.gz.* | tar -tz | head -n 20(仅列出前 20 个文件,快速校验) - 完整还原测试(推荐):
cat upload_20260721.gz.* | tar -xzf - -C /tmp/test_unpack,再检查关键文件是否存在 - 注意:不要用
cat *.gz.* > all.gz再解压——若某片损坏,整个 all.gz 就不可用;流式解压能尽早报错
常见误区提醒
- 别用 tar -M(旧式分卷):该模式已废弃,依赖磁带设备语义,现代 Linux 不兼容,易出错
-
split 后缀别用默认字母:xaa/xab 容易和其它工具冲突,
-d+-a N更清晰稳定 -
大小单位写全:写
500M而非500m(小写 m 在部分系统中被解释为 1000×1000,而非 1024×1024) -
权限与路径注意:如果目标目录无写权限,split 会失败;建议提前
mkdir -p /output/dir && cd /output/dir











