cat 直接合并不安全,需排序、校验、分块;小文件用 ls -v 或 sort -z 排序后 cat;大文件须 split 切块+sha256 校验+pipefail 捕错。

cat 能直接合并,但对大文件或生产环境不安全——它不校验、不排序、不反馈进度,出错就是半截脏数据。
用 cat 合并小文件(
适合日志归档、配置拼接等轻量场景,前提是文件数量少、体积小、编码一致:
- 按指定顺序合并:
cat file1.log file2.log file3.log > all.log - 通配符合并前必须显式排序,否则
ls *.log按字典序排(app_10.log会排在app_2.log前):ls -v app_*.log | xargs cat > all.log - 跨目录合并要避免
find ... -exec cat {} +的隐式乱序,改用:find /logs -name "*.log" -print0 | sort -z | xargs -0 cat > merged.log - 别依赖
>>追加大文件——中断后无法定位断点,覆盖写更可控
合并大文件(>1GB)必须分块 + 校验
直接 cat 容易触发 OOM、磁盘满、中断损坏;paste 和 join 会全行加载进内存,基本不可用:
- 先切块:
split -l 500000 bigfile.log chunk_(每 50 万行一块) - 每块合并后立刻算校验:
sha256sum chunk_* >> chunks.sha256 - 拼接时加错误捕获:
set -o pipefail; cat chunk_* > final.log || echo "failed at last chunk" >&2 - 抽样比对内容(别信
wc -l):diff
合并前必须检查的三件事
90% 的“内容错乱”不是命令问题,而是环境没控住:
- 查编码是否混用:
file -i file1.log file2.log(utf-8和iso-8859-1混合会导致截断或乱码) - 查文件尾部是否干净:
tail -c 100 file1.log | od -c(看有没有意外\0或二进制垃圾) - 查磁盘空间是否足够:
du -sb *.log | awk '{sum+=$1} END{print sum}',再对比df -h .
别踩 paste/join 的坑
这两个命令看着像“高级合并”,实际对大文件是陷阱:
-
paste行数不等时会在短文件末尾疯狂补空行,最终体积可能翻倍 -
join强制要求输入已排序,而sort处理几十 GB 文件时极易因/tmp空间不足失败:sort: write failed: /tmp: No space left on device - 真要列对齐合并大文件,得先用
awk '{print NR,$0}'加行号,再分块sort -k1,1n,最后awk '{print substr($0,index($0," ")+1)}'去行号——不如直接写 Python 脚本
真正稳的合并,靠的是显式控制顺序、分块释放内存、每步可验证。哪怕多写三行命令,也比半夜修一个损坏的 20GB 日志强。


















