Linux split 命令
split 是 Linux 中内置的文件拆分工具,可以将一个文件按行数、大小或指定数量进行切割。
split 命令用于将一个大文件拆分成若干个小文件,方便传输、存储或并行处理。
拆分后的小文件可以通过 cat 命令重新合并还原为原始文件。
当遇到日志文件过大无法用编辑器打开、需要将大文件分块上传、或希望并行处理数据时,split 是首选的解决方案。
拆分后的文件默认以 xaa、xab、xac 等字母序列命名。
split不会删除或修改原始文件,拆分操作是安全的。但拆分大量小文件时要注意磁盘空间是否充足。
命令语法
split 的基本语法如下:
split [选项] [输入文件] [输出文件前缀]
如果不指定输入文件,则从标准输入读取数据。
如果不指定输出文件前缀,默认使用 x 作为前缀。
split 的常用选项整理如下:
| 选项 | 功能 | 示例 |
|---|---|---|
-b, --bytes=大小 | 按指定字节数拆分文件 | split -b 100M large.log |
-l, --lines=行数 | 按指定行数拆分文件 | split -l 1000 data.txt |
-n, --number=数量 | 拆分为指定数量的小文件 | split -n 5 data.txt |
-a, --suffix-length=N | 指定后缀长度(默认为 2) | split -a 3 -l 100 data.txt |
-d, --numeric-suffixes | 使用数字后缀替代字母后缀 | split -d -l 100 data.txt |
-C, --line-bytes=大小 | 按大小拆分,但保持每行完整 | split -C 10M log.txt |
--verbose | 显示详细的拆分过程信息 | split --verbose -b 10M file.bin |
大小单位支持:K(KB)、M(MB)、G(GB)、T(TB)等后缀。
-b 与 -C 的区别:
| 选项 | 行为 | 适用场景 |
|---|---|---|
-b | 严格按字节数切割,可能在行中间截断 | 二进制文件、不在意换行的场景 |
-C | 在达到大小上限时尽量在行边界处切割,保证每一行完整 | 文本日志、CSV 等需要保持行完整的场景 |
拆分文本文件时,优先使用
-C而非-b,避免某行数据被截断在两个文件中。
详细用法
按行数拆分
按行数拆分是最直观的方式,适合处理日志文件或 CSV 数据。
# 生成一个包含 5000 行的测试文件 $ seq 1 5000 > data.txt # 每 1000 行拆分为一个小文件 $ split -l 1000 data.txt part_ # 查看生成的文件 $ ls -lh part_* -rw-r--r-- 1 runoob runoob 3.9K May 19 14:30 part_aa -rw-r--r-- 1 runoob runoob 3.9K May 19 14:30 part_ab -rw-r--r-- 1 runoob runoob 3.9K May 19 14:30 part_ac -rw-r--r-- 1 runoob runoob 3.9K May 19 14:30 part_ad -rw-r--r-- 1 runoob runoob 3.9K May 19 14:30 part_ae
运行后生成了 5 个文件,每个文件恰好 1000 行,文件名以 part_ 为前缀。
按文件大小拆分
按大小拆分适合切割二进制文件或用于控制单个文件体积的上限。
# 生成一个 10MB 的测试文件 $ dd if=/dev/urandom of=test.bin bs=1M count=10 # 按每 2MB 拆分 $ split -b 2M test.bin chunk_ # 查看拆分结果 $ ls -lh chunk_* -rw-r--r-- 1 runoob runoob 2.0M May 19 14:32 chunk_aa -rw-r--r-- 1 runoob runoob 2.0M May 19 14:32 chunk_ab -rw-r--r-- 1 runoob runoob 2.0M May 19 14:32 chunk_ac -rw-r--r-- 1 runoob runoob 2.0M May 19 14:32 chunk_ad -rw-r--r-- 1 runoob runoob 2.0M May 19 14:32 chunk_ae
指定拆分数量
使用 -n 可以将文件均分为指定数量的小文件。
# 将文件均分为 3 份 $ split -n 3 data.txt equal_ # 查看各文件行数 $ wc -l equal_* 1667 equal_aa 1667 equal_ab 1666 equal_ac 5000 total
可以看到文件被尽可能均匀分配,总数 5000 行的文件被分为约 1667 行一份。
当文件总行数无法被整除时,前面的文件会多承担几行,后面的文件会少几行。
使用数字后缀
默认的字母后缀(aa、ab...)不够直观,可以使用 -d 切换为数字。
# 使用数字后缀,并指定后缀长度为 3 $ split -d -a 3 -l 1000 data.txt runoob_ # 生成的文件名 $ ls runoob_* runoob_000 runoob_001 runoob_002 runoob_003 runoob_004
这里后缀长度为 3 意味着最多支持 1000 个文件(从 000 到 999),拆分大量小文件时可以增加 -a 的值。
保持行完整性拆分文本
使用 -C 可以在按大小拆分的同时保证每行不被截断。
# 生成一个包含不同长度行的测试日志 $ for i in $(seq 1 100); do echo "Line $i: RUNOOB testing data $(head -c $((RANDOM % 50 + 10)) /dev/urandom | base64)"; done > log.txt # 按 1KB 拆分,同时保持行完整性 $ split -C 1K log.txt log_ # 检查每个文件的最后一行是否完整(都以换行符结尾) $ for f in log_*; do echo "$f: $(tail -c 1 $f | xxd | grep -c '0a')"; done
-C 保证每个拆分文件的最后一行都是完整的,不会出现行被截成两半的情况。
合并拆分后的文件
拆分后的文件可以无损合并还原:
# 合并所有拆分文件,还原为原始文件 $ cat part_* > restored.txt # 验证合并后的内容与原始文件一致 $ diff data.txt restored.txt && echo "文件一致,合并成功" 文件一致,合并成功
合并时 cat 会按 shell 通配符的字母顺序依次拼接,这正好与 split 生成文件的顺序一致。
常见问题
拆分后的文件仍占用与原始文件相同的磁盘空间总量(实际上会多出一些文件系统元数据的开销),请确保磁盘剩余空间充足。
使用数字后缀时,如果拆分文件数超过后缀长度能表示的最大值(如
-a 2最多 100 个文件),split会报错退出。增大-a参数的值即可解决。
如果需要按特定内容拆分(如按某个分隔符),split 不支持,应改用 csplit 命令。
从标准输入读取数据时,split 无法预估总大小,因此 -n 指定数量的功能不支持标准输入模式。
相关命令
| 命令 | 功能 |
|---|---|
cat | 合并文件或输出文件内容 |
csplit | 按内容(正则表达式)拆分文件 |
wc | 统计文件的行数、单词数、字节数 |
dd | 转换和复制文件,可按块大小截取数据 |
head | 输出文件的开头部分 |
tail | 输出文件的结尾部分 |

Linux 命令大全