split 是什么
split 是 GNU coreutils 里的文件切分工具,把一个大文件按字节数、行数或份数切成多个小文件。典型动机有三个:目标平台对单文件大小有硬限制、跨网络传输需要分片重传、下游程序一次吃不下整份数据。切分本身不做校验,也不在被切分文件里保存任何元信息,还原完全依赖输出文件名的顺序拼接(cat 前缀* 重定向回原文件),所以切分与合并之间必须用外部摘要(sha256sum)来证明完整性。
基本信息
| 适用平台 | GNU/Linux、macOS(BSD 版选项更少) |
|---|---|
| 语法 | split [选项] [输入文件 [输出前缀]] |
| 默认行为 | 按 1000 行切分,输出 xaa、xab 等文件名 |
| 合并方式 | cat 前缀* > 原文件,顺序依赖文件名排序 |
| 常用选项 | -b 按字节 -l 按行 -n 按份数 -d 数字后缀 -a 后缀位数 |
| 注意 | 输入读取失败时不会自动清理已生成的 分片 |
典型使用场景
- 上传到对单文件大小有限制的平台,先切片再传,落地后合并并校验。
- 跨公网传超大文件时切片并行传输,某片失败只重传那一片,不用从头再来。
- 把几十 GB 的 CSV 或 SQL 文本按行数切小,分发给多个处理进程并行跑。
- 准备压测或训练样本时按固定行数切分,控制单批数据量。
- 把大文件切成固定字节的块,喂给只接受小块输入的老旧程序或接口。
常用写法
常用写法
split -b 100M -d -a 2 backup.tar.gz part_ # 每 100MB 一片,得到 part_00 part_01 ...
split -l 500000 big.csv chunk_ # 每 50 万行一片
split -n 4 huge.log seg_ # 按字节均分成 4 片
split -b 100M -d -a 2 -e big.iso p_ # -e 不生成最后的空分片
sha256sum backup.tar.gz > backup.sha256 # 切分前先记录原文件摘要
cat part_* > backup.tar.gz # 按文件名顺序合并还原
sha256sum -c backup.sha256 # 合并后校验一致才算成功
wc -c part_* | tail -1 # 累加分片字节数,与原始大小比对选项与切点对照
| 选项 | 作用 | 使用要点 |
|---|---|---|
| -b 100M | 按字节大小切分 | 配合 -d -a 2 得到可排序的数字后缀 |
| -l N | 按行数切分 | 文本文件首选,切点落在行边界不破坏记录 |
| -n N | 均分为 N 片 | 按字节平摊,文本可能从行中间断开 |
| -d | 改用十进制数字后缀 | 替代默认字母后缀,便于脚本处理与排序 |
| -a N | 设置后缀位数 | 位数不足会进位导致乱序,统一位数才安全 |
| -e | 不生成空白分片 | 输入正好整除时避免多出一个 0 字节文件 |
合并顺序由 shell 通配符排序决定:part_10 会排在 part_2 之前。用 -d 生成数字后缀并固定 -a 位数,或者合并时显式排序(ls part_* | sort | xargs cat > 原文件)都能避开这个坑。
切分不校验内容,丢片或传坏往往到恢复时才发现。稳妥流程是:切分前记录整体 sha256,分片全部落地后合并,再用 sha256sum -c 复核;校验不通过就整批重传,不要在坏文件上继续操作。
GNU split 的 -d、-a、-n 属于扩展选项,BSD 与 macOS 自带 split 选项集更小,跨平台脚本要么避开这些选项,要么在目标机先确认版本。