名称

split - 将文件分割成多个文件

简介

split [选项]... [输入 [前缀]]

描述

split 命令将输入文件分割成大小相等(或行数相等)的多个小文件,便于传输、存储或进一步处理。如果没有指定输入文件或输入文件为 -,则从标准输入读取。输出文件默认以 x 开头,后跟两个字母(如 xaaxab),除非指定了其他前缀。

该命令主要用于:

  • 将大文件分割成多个小文件以便通过邮件发送或上传。

  • 将日志文件按大小或行数分块处理。

  • 配合 cat 恢复原始文件。

选项

短选项

长选项

描述

-l 行数

--lines=行数

每个输出文件包含指定行数(默认值 1000)。

-b 大小

--bytes=大小

每个输出文件包含指定字节数。大小可带单位:K(KB)、M(MB)、G(GB)、T(TB)等,或 KiBMiB 等(若使用 K 默认 1024,建议明确)。

-C 大小

--line-bytes=大小

每个输出文件中最大字节数,但会尽量保持行完整(按行截断不超过此大小)。

-d

--numeric-suffixes

使用数字后缀(如 x00x01),而不是默认的字母后缀。

--numeric-suffixes[=起始值]

使用数字后缀并可指定起始值。

-a 长度

--suffix-length=长度

指定后缀长度(字母或数字的位数),默认为 2。

--additional-suffix=后缀

所有输出文件名后添加指定后缀(如 .txt)。

-x

--hex-suffixes

使用十六进制数字后缀(如 x00x01... x0a 等),需结合 -d 或独立使用(某些版本支持)。

-e

--elide-empty-files

不生成空的输出文件(当输入正好被完全分割时,最后一个文件也可能为空,此选项可避免)。

-t 分隔符

--separator=分隔符

使用指定的分隔符作为记录分隔符,而不是换行符(用于非文本文件分割)。

-u

--unbuffered

立即输出每个记录,而不进行缓冲(某些实现支持)。

--verbose

在创建每个输出文件前显示信息(某些实现支持)。

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

退出状态

  • 0 – 成功。

  • >0 – 发生错误(例如无法读取输入文件、无效选项、磁盘空间不足等)。

常用示例

1. 按行数分割(每 1000 行一个文件)

split -l 1000 largefile.txt

生成 xaaxabxac 等文件。

2. 指定输出文件前缀

split -l 500 largefile.txt part_

生成 part_aapart_ab 等。

3. 按大小分割(每个 10MB)

split -b 10M bigfile.bin

生成 xaaxab 等,每个约 10MB。

4. 使用数字后缀

split -d -l 1000 data.txt

生成 x00x01x02 等。

5. 指定数字后缀起始值和长度

split -d --numeric-suffixes=100 -a 3 data.txt

生成 x100x101x102 等,后缀长度为 3 位数字。

6. 添加额外后缀(如文件扩展名)

split -l 500 --additional-suffix=.txt data.txt chunk_

生成 chunk_aa.txtchunk_ab.txt 等。

7. 按行数但确保每行完整(最大大小限制)

split -C 2M logfile.txt segment_

每个文件最大 2MB,但以行为单位截断,不会将一行拆到两个文件。

8. 从标准输入分割

cat largefile | split -l 1000 - output_

从管道读取数据,输出文件以 output_ 开头。

9. 使用十六进制后缀

split -x -l 500 data.txt

生成 x00x01、... x0ax0b 等(如果支持)。

10. 分割文件并保留空行的处理

split -l 10 --elide-empty-files file.txt

如果最后一个文件恰好为空,则不创建该文件。

11. 按自定义分隔符分割记录(例如以 NUL 分隔)

split -t '\0' -l 10 data.bin chunk_

以 NUL 字符作为记录分隔符,每 10 条记录一个文件。

12. 合并分割后的文件

cat x?? > restored_file

将分割后的所有文件按顺序合并回原文件。

注意事项

  • 默认情况下,split 生成的文件名后缀为两位字母:aaab、...、zz。如果分割的份数超过 676(26²),则会增加后缀长度。可以使用 -a 指定足够长度避免溢出。

  • 使用数字后缀时,后缀位数默认为 2,可通过 -a 调整,起始值通常为 0(GNU 版本可用 --numeric-suffixes=起始值 指定)。

  • 文件大小单位:K 默认是 1024 字节,M 是 1024²,G 是 1024³,T 是 1024⁴。若要使用 1000 进制,可明确使用 KBMB 等(某些版本支持)。建议阅读 man split 确认支持的单位。

  • 当使用 -b 分割二进制文件时,split 不会检查文件内容,直接按字节切割。合并时需确保顺序正确,否则文件损坏。

  • 如果输入文件是普通文件,split 默认会从头开始读取;如果输入是 -(标准输入),则从管道读取数据。

  • 在脚本中使用时,应考虑磁盘空间和 inode 数量,避免因分割过多文件导致性能问题。

  • 某些 split 实现(如 GNU)还支持 --filter 选项,可以对每个输出片段执行命令(例如压缩),但此功能较高级,可参考手册。

相关命令

  • csplit – 根据上下文行(正则表达式)分割文件,而非固定大小/行数。

  • cat – 合并文件(用于恢复分割的文件)。

  • head / tail – 提取文件开头或结尾部分。

  • dd – 低级别复制和转换,可按块大小分割。

  • gzip / bzip2 – 压缩工具,常与 split 配合压缩大文件后再分割(或先分割再压缩)。