大文件合并不能直接用cat,需分块处理并校验:先用split切分,每块计算sha256sum,cat拼接时加错误捕获,再抽样比对内容;同时检查编码、文件尾部和磁盘空间。

cat 能合并,但直接用它处理大文件(比如几 GB 的日志或导出数据)容易卡住、吃光内存、甚至因磁盘满或中断导致损坏——关键不是“能不能”,而是“怎么不翻车”。
大文件合并别用 cat *.log > all.log
通配符展开顺序不可控,ls 默认按字典序排,access_10.log 会排在 access_2.log 前面;更糟的是,cat 是纯流式读写,不校验、不缓冲控制、不报告进度,一旦中途断电或 Ctrl+C,目标文件就是半截脏数据。
必须显式干预排序和加进度反馈:
- 按自然序拼接:
ls -v access_*.log | xargs cat > all.log - 跨目录安全合并:
find /data/logs -name "app_*.log" -print0 | sort -z | xargs -0 cat > merged.log - 加进度条(需先装
pv):find ... | sort -z | xargs -0 cat | pv -s $(du -sb /data/logs/app_*.log | awk '{sum+=$1} END{print sum}') > merged.log
paste 和 join 对大文件基本失效
这两个命令内部会把整行加载进内存做比对或对齐,join 还强制要求预排序——对几十 GB 文件,sort 本身就要临时空间数倍于原文件,极易触发 sort: write failed: /tmp: No space left on device;paste 虽不排序,但行数不等时会在短文件末尾疯狂补空行,最终文件体积可能翻倍。
结论:只在明确知道文件小于 500MB、且行数严格对齐时才考虑 paste;join 一律换成外部排序 + 分块处理脚本。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
真正稳的大文件合并:分块 + 校验 + 可断点
单靠 shell 命令已不够,得组合工具链:
- 用
split -l 1000000 bigfile.log切成百万行一块,避免单次内存压力 - 每块合并后立刻算
sha256sum,存到chunks.sha256,后续可验证完整性 - 用
cat chunk_001 log chunk_002 log ... > final.log拼接,但加set -o pipefail和|| echo "ERROR at chunk_007" >&2捕获中断点 - 最后用
diff 抽样比对开头段落
wc -l 校验总行数——大文件里空行、超长行、编码 BOM 都会让计数失真,必须用 head/tail 抽样比内容。
合并后发现内容错乱?先查这三件事
大文件合并出问题,90% 不是命令写错,而是环境没控住:
-
file -i file1.log file2.log—— 看是否混了iso-8859-1和utf-8,编码不一致会导致cat输出乱码甚至截断 -
tail -c 100 file1.log | od -c—— 检查结尾有没有意外的\0或二进制垃圾(某些日志轮转工具会写坏尾部) -
df -h /target/mount/point—— 目标分区剩余空间是否 ≥ 1.2 × 原文件总大小(cat写入时无原子性,空间不足就直接失败)
awk 'FNR==1{print "\n=== " FILENAME " ==="} 1')在大文件场景下反而更难 debug,慎用。










