split命令默认按1000行分割,日志文件需用-b参数按字节大小切割,单位区分大小写(如10M合法、10m报错),配合-d和-a可生成数字后缀文件,合并时须用自然排序避免顺序错乱。

split 命令默认按行切,但日志文件要按大小切必须加 -b 参数
直接 split 不带参数会按行数切(默认 1000 行),对日志这种每行长度不一的文件完全不可控。真正按字节大小切,得用 -b 选项,单位支持 B、K、M、G(注意大小写敏感,10M 合法,10m 会报错)。
-
split -b 10M access.log access_part_:切成每个 ≤10MB 的文件,后缀自动为aa、ab…,前缀用access_part_ - 实际切割大小可能略超指定值——
split不会在行中间截断,默认以行为单位找最接近的边界,所以最后一块可能比-b值大几 KB - 如果硬要严格控制单个文件 ≤10MB 且不跨行,得加
--lines=1配合-b,但效率低,一般没必要
怎么让分割后的文件带数字后缀而不是 aa/ab
默认用字母后缀(aa、ab…),最多到 zz(1378 个文件),超出会报错。日志归档常需数字序号,用 -d 开启数字后缀,再用 -a 控制位数:
-
split -b 100M -d -a 3 app.log part_→ 输出part_000、part_001… -
-a 3是必须的,否则即使加-d也只用 2 位(00、01…),超过 99 就溢出变100而不是100(其实会出错,split要求位数显式指定) - 数字后缀从 0 开始,不能自定义起始值(比如从 1 开始),需要的话得切完再重命名
切完怎么合并回原文件?别用 cat + 通配符盲目拼
用 cat part_* > merged.log 看似合理,但有隐患:shell 通配符按 ASCII 排序,part_1 会排在 part_10 前面,导致顺序错乱。正确做法是明确排序:
-
cat part_{000..099} > merged.log(bash 4.0+ 支持花括号展开,安全) - 或用
ls -v part_* | xargs cat > merged.log(-v启用自然排序,part_1、part_10、part_2会被正确排序) - 如果原始文件含中文或特殊字符,
ls可能因 locale 导致排序异常,优先选花括号展开
大日志文件切分时卡住或速度慢?检查是否被其他进程占用
split 本身很快,但如果目标文件正被 tail -f、rsyslog 或应用持续写入,split 读取时可能阻塞或读到不一致内容。更麻烦的是,某些日志轮转工具(如 logrotate)配置了 copytruncate,会导致 split 读到空文件或截断中的状态。
- 先用
lsof +D /path/to/log/dir查是否有进程在写该文件 - 稳妥做法:停止写入(如暂停服务)、或用
cp先复制一份静态快照再切分 - 不要对正在写的文件直接
split,尤其当它被open(O_APPEND)持有时,split可能读到部分写入的脏数据
实际操作中,最容易忽略的是后缀排序和文件锁定问题——前者导致合并失败,后者导致切出来的是损坏片段。


















