概述
split 命令是按大小/固定行数拆分大文件 的轻量工具,核心特点是简单粗暴、高效通用 ,区别于 csplit 按内容/正则拆分的逻辑,split 仅关注文件的物理尺寸 或行数量,是处理超大文件(日志、备份、数据文件)的必备基础命令,适合快速拆分、便于传输/存储/处理。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、基本语法
bash
split [选项] 源文件 [输出文件前缀]
- 无
输出文件前缀时,默认生成xaa、xab、xac...命名的拆分文件; - 支持多源文件,但会按顺序拼接后统一拆分;
- 可通过管道读取标准输入(
命令 | split [选项] - [前缀],-代表标准输入)。
二、核心拆分方式(2种核心用法)
split 的核心能力只有两个:按文件大小拆分 、按固定行数拆分 ,搭配少量选项即可满足99%的使用场景,默认行为:按每1000行 拆分,前缀x,后缀2个字母(aa/ab/ac)。
三、高频实用选项(按功能分类)
选项极简且易记,核心围绕拆分规则 、后缀格式 、行为控制设计,可自由组合:
| 选项 | 作用 | 实用场景 |
|---|---|---|
| 按行数拆分 | ||
-l N |
--lines=N,按每N行拆分(默认1000行) |
拆分日志、文本文件,按行分割便于逐段查看 |
| 按大小拆分 | ||
-b SIZE |
--bytes=SIZE,按指定大小 拆分,支持单位:K(1024)、M(1024K)、G(1024M)、k(1000)、m(1000k) |
拆分超大备份文件、压缩包、二进制文件 |
-C SIZE |
--line-bytes=SIZE,按最大SIZE字节 拆分,不拆分整行(仅适用于文本) |
按大小拆分但保留文本行完整性,避免行截断 |
| 后缀格式(重点) | ||
-d |
--numeric-suffixes,用数字后缀替代字母(00/01/02...),更易排序和批量处理 |
脚本批量处理拆分后的文件,数字后缀更友好 |
-a N |
--suffix-length=N,指定后缀位数 (默认2位),配合-d使用 |
拆分文件数量多(超100个)时,指定3/4位后缀 |
| 其他实用选项 | ||
-e |
--elide-empty-files,忽略拆分后的空文件 |
源文件较小时,避免生成空的拆分文件 |
-u |
--unbuffered,无缓冲输出,适合实时拆分管道流 |
实时拆分日志输出、命令执行的流式结果 |
四、经典实操示例(覆盖所有核心场景)
场景1:基础按行数拆分(默认/自定义)
bash
# 默认:按1000行拆分,生成xaa、xab、xac...
split large_log.txt
# 自定义:按500行拆分,指定前缀log_,数字后缀00/01
split -l 500 -d large_log.txt log_
# 生成:log_00、log_01、log_02...
场景2:按大小拆分(最常用,二进制/文本通用)
bash
# 按每200M拆分超大备份文件,数字后缀3位,前缀backup_
split -b 200M -d -a 3 backup.tar.gz backup_
# 生成:backup_000、backup_001、backup_002...(适合超1000个拆分文件)
# 按每1G拆分,用1000进制单位(1G=1000M),字母后缀
split -b 1g large_data.bin data_
场景3:按大小拆分且保留文本行完整性(-C)
针对文本文件,避免-b将整行截断 (比如一行长文本跨2个拆分文件),用-C:
bash
# 按最大500K字节拆分,不拆分整行,数字后缀
split -C 500K -d longline.txt txt_
场景4:管道配合拆分(实时拆分命令输出)
将其他命令的输出直接拆分,无需生成临时文件,-代表标准输入:
bash
# 查看超大日志并按200行拆分,前缀grep_log_
grep "ERROR" /var/log/messages | split -l 200 -d - grep_log_
# 实时拆分dd命令的磁盘备份流,按1G拆分
dd if=/dev/sda of=- bs=1M | split -b 1G -d -a 3 - sda_backup_
场景5:拆分后批量合并(反向操作,必学)
split 拆分的文件可通过cat按后缀顺序直接合并,还原为原文件,无任何损失:
bash
# 合并数字后缀的拆分文件(log_00、log_01...)
cat log_* > large_log_restore.txt
# 合并字母后缀的拆分文件(xaa、xab...)
cat x* > backup_restore.tar.gz
场景6:指定后缀位数(处理大量拆分文件)
若源文件超大,拆分后文件数超100个,默认2位后缀不够,用-a指定3/4位:
bash
# 按500M拆分,数字后缀3位(000-999),前缀bigfile_
split -b 500M -d -a 3 bigfile.dat bigfile_
五、与csplit的核心区别(必分清,避免用错)
split 和 csplit 都是文件拆分工具,但设计目标完全不同,无优劣之分,按需选择是关键,核心差异对比:
| 命令 | 拆分依据 | 后缀格式 | 支持文件类型 | 核心优势 | 适用场景 |
|---|---|---|---|---|---|
split |
物理尺寸(行数、字节数) | 字母/数字,可指定位数 | 所有文件(文本/二进制/压缩包) | 简单高效、通用,不依赖文件内容 | 超大文件拆分(备份/日志/压缩包)、按固定行/大小分割 |
csplit |
内容上下文(行号、正则、关键词) | 数字,可指定前缀/位数 | 仅文本文件 | 按内容精准拆分,支持复杂规则 | 日志按日期/关键词拆分、文本按段落/空行拆分 |
六、关键注意事项
- 合并无顺序问题 :拆分后的文件按后缀字典序 合并即可完全还原原文件,数字后缀(
-d)更易保证顺序; - 单位区分 :
-b的K/M/G是1024进制 (计算机存储),k/m/g是1000进制(物理存储),按需选择; - 二进制文件注意 :拆分二进制文件(压缩包、可执行文件、镜像)只能用
-b,不能用-l/-C(按行拆分无意义); - 空文件处理 :源文件行数/大小小于拆分规则时,仅生成1个拆分文件,加
-e可彻底避免空文件; - 覆盖问题 :若当前目录已有同前缀后缀的文件,
split会直接覆盖,建议拆分前确认目录无重名文件。
七、拓展:拆分+压缩组合(实用技巧)
拆分超大文件前,若需压缩,可先压缩后拆分 (更小的文件体积,便于传输),合并时先合并后解压:
bash
# 第一步:压缩源文件
gzip -c large_file.dat > large_file.dat.gz
# 第二步:按100M拆分压缩包
split -b 100M -d -a 3 large_file.dat.gz file_gz_
# 传输后合并+解压(还原原文件)
cat file_gz_* | gzip -d > large_file_restore.dat
总结
split 是通用型大文件拆分工具 ,核心价值是简单、高效、跨文件类型 ,日常使用的高频组合:
- 拆分文本/日志(按行):
split -l N -d 源文件 前缀 - 拆分二进制/压缩包(按大小):
split -b SIZE -d -a N 源文件 前缀 - 拆分文本且保留行完整(按大小):
split -C SIZE -d 源文件 前缀 - 管道实时拆分:
命令 | split -l/-b N -d - 前缀 - 拆分后还原:
cat 前缀* > 原文件名