正确合并文件需绕过默认陷阱:按自然序排序(如ls -v或sort -z)、统一编码(iconv转换)、避免参数过长(find+xargs -0)、添加分隔标识(awk加标题或空行)。

直接用 cat 就能合并,但默认行为容易踩坑——顺序错、编码乱、文件一多就报错。关键不是“会不会”,而是“怎么绕过默认陷阱”。
按正确顺序合并(尤其带数字编号的文件)
shell 通配符 *.log 展开是字典序,file10.txt 会排在 file2.txt 前面。自然序(1, 2, 10)得靠排序工具。
- 临时合并:用
ls -v | xargs cat > merged.txt,-v支持版本式排序 - 脚本中更稳:用
find . -name "data_*.csv" -print0 | sort -z | xargs -0 cat > full.csv - 最保险:显式列出文件名,比如
cat data_1.csv data_2.csv data_10.csv > full.csv
处理不同编码,避免解析失败
cat 是字节拼接,不识别编码。混入 GBK 和 UTF-8 文件,后续用 awk 或 Python 读就会报错。
- 先查编码:
file -i *.txt看各文件的charset=字段 - 统一转为无 BOM UTF-8:
iconv -f gbk -t utf-8 file_gbk.txt > file_utf8.txt - 批量过滤纯文本再合并:
file --mime-type *.txt | awk -F: '$2 ~ /text/ {print $1}' | xargs cat > merged.txt
上千个小文件不崩掉
直接 cat * 容易触发 Argument list too long 错误,本质是参数字符串超长,和文件大小无关。
- 安全做法:
find . -name "*.log" -print0 | xargs -0 cat > all.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——反复打开文件、多次 seek,慢且易出错
让合并结果可读、可追溯
默认拼一起没分隔,根本看不出哪段来自哪个文件。审计或调试时必须加标记。
- 每文件开头加标题:
awk 'FNR==1{print "\n=== " FILENAME " ==="} 1' file1.txt file2.txt > merged.txt - 只加空行(轻量):
awk 'FNR==1 && NR!=1{print ""} {print}' *.log > spaced.log - 合并前后插说明:
{ echo "# Generated on $(date)"; cat *.conf; } > final.conf


















