用cat合并文件需规避顺序错、编码乱、参数超限和内容混杂四大坑:按自然序排序(如ls -v)、统一转UTF-8编码、用find+xargs防超限、加文件标题或空行分隔以保可读可追溯。

用 cat 最直接,但得避开几个默认行为的坑——顺序错、编码乱、文件太多报错、内容混在一起分不清。真正卡住人的,从来不是“会不会”,而是合并后内容不可信、不可读、不可追溯。
按正确顺序合并(尤其带数字编号的文件)
别写 cat *.log > all.log —— shell 对通配符按字典序展开,file10.txt 会排在 file2.txt 前面,导致日志时间错乱。
- 用自然序排序:
ls -v *.log | xargs cat > all.log - 脚本中更稳妥:
find . -name "data_*.csv" -print0 | sort -z | xargs -0 cat > merged.csv - 显式列出最保险:
cat data_1.csv data_2.csv data_3.csv > merged.csv
统一编码再合并,避免解析失败
cat 是字节拼接,不识别 UTF-8、GBK 或 BOM。混入不同编码的文件,grep 会漏匹配,awk 报 invalid byte sequence,Python 读取直接崩溃。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先查编码:
file -i *.txt看charset=字段 - 转为无 BOM UTF-8:
iconv -f gbk -t utf-8 input.txt > output.txt - 跳过二进制文件:
file --mime-type *.txt | awk -F: '$2 ~ /text/ {print $1}' | xargs cat > merged.txt
上千个小文件?防参数超限
cat * 在文件名太多时会报 Argument list too long,这不是内存问题,是 shell 传给命令的参数字符串超长(通常 >2MB)。
- 安全处理:
find . -name "*.log" -print0 | xargs -0 cat > full.log - 要保序加
sort -z:find . -name "chunk_*.log" -print0 | sort -z | xargs -0 cat > full.log - 别用循环追加:
for f in *.log; do cat "$f" >> out.log; done效率低且易出错
加标记区分来源,提升可读性与可追溯性
默认合并后所有内容连成一片,审计、调试、归档时根本不知道哪段来自哪个文件。
- 每文件开头加标题:
awk 'FNR==1{print "\n=== " FILENAME " ==="} 1' *.log > merged.log - 只加空行分隔:
awk 'FNR==1 && NR!=1{print ""} {print}' *.log > spaced.log - 全局加行号便于定位:
awk '{print NR ": " $0}' *.conf > numbered.conf

















