现在位置: 首页 > Linux 教程 > 正文

Linux split 命令

Linux 命令大全 Linux 命令大全

split 是 Linux 中内置的文件拆分工具,可以将一个文件按行数、大小或指定数量进行切割。

split 命令用于将一个大文件拆分成若干个小文件,方便传输、存储或并行处理。

拆分后的小文件可以通过 cat 命令重新合并还原为原始文件。

当遇到日志文件过大无法用编辑器打开、需要将大文件分块上传、或希望并行处理数据时,split 是首选的解决方案。

拆分后的文件默认以 xaaxabxac 等字母序列命名。

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 行一份。

当文件总行数无法被整除时,前面的文件会多承担几行,后面的文件会少几行。

使用数字后缀

默认的字母后缀(aaab...)不够直观,可以使用 -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 命令大全 Linux 命令大全