split -b 100m 安全切分日志,自动对齐行边界不跨行;推荐用 -d -a 4 生成数字后缀(如 part_0000),便于排序与脚本处理;切分后需验证总大小和哈希值确保无损还原。

直接用 split -b 100M 就能完成,但日志文件有特殊性——每行长度不一,必须避免跨行截断,同时要兼顾命名清晰、便于后续处理。
按100MB严格切分,不跨行
日志是文本,split 默认以行为单位切割,即使加了 -b 也不会在行中间断开。所以 split -b 100M access.log part_ 是安全的:它会找最接近100MB的行边界停,实际单个文件可能略超(比如100.2MB),但绝不会撕裂某条日志记录。
- 单位大小写敏感:写
100M正确,100m会报错 - 输出默认为字母后缀:
part_aa、part_ab… 最多支持 26×26 = 676 个文件(到zz) - 若日志超过676份,必须改用数字后缀,否则命令失败
用数字后缀,方便排序与脚本处理
字母后缀在文件数量多时难排序(part_zz 后不是 part_ba,而是报错),推荐统一用数字:
-
split -b 100M -d -a 4 access.log part_→ 生成part_0000、part_0001…(-a 4指定4位,最多9999个文件) -
-d必须搭配-a使用,否则仍只用2位(00–99),超限就出错 - 数字从0开始,不能设起始值;如需从1开始,切完再用
rename或循环重命名
验证切分效果和还原可靠性
切完别急着删原文件,先做两件事:
- 检查总大小:
ls -lh part_* | awk '{sum += $5} END {print sum/1024/1024 " MB"}',应略大于原文件(因每块含完整行) - 还原测试:
cat part_* > access.log.recovered && sha256sum access.log access.log.recovered,两个哈希值一致才说明无损 - 注意:合并时必须按自然顺序(
part_0000→part_0001…),用cat part_* > ...在数字后缀下是安全的;字母后缀则建议用ls -v | xargs cat > ...防止aa、ab、az、ba乱序
进阶:配合管道或压缩流实时切分
如果日志还在写入,或想边压缩边切分,split 支持标准输入:
- 压缩后切分:
gzip -c access.log | split -b 100M - part_.gz(-表示读stdin,输出如part_.gzaa) - 切分+重命名一步到位:
split -b 100M -d -a 3 access.log part_ && rename 's/part_/log_20260721_/' part_* - 加
--verbose可看每块生成过程,适合调试或监控大任务进度











