將成百上千個 SQL 腳本、日誌文件、代碼片段合併為單一文件,是數據遷移、日誌分析、代碼審計的高頻需求。本文對比 cat、sed、awk、find+xargs 多種方案,並針對大文件、二進制文件、編碼不一致場景給出優化策略。

| 命令 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
cat *.sql > all.sql | 同目錄文本文件、數量 < 1萬 | 最簡單、Shell 擴展自動排序 | 參數列表過長報錯、不遞歸 |
cat file1 file2 file3 > merged | 指定順序、少量文件 | 精確控制順序 | 手工繁瑣 |
find . -name '*.sql' -exec cat {} + > all.sql | 遞歸查找、大量文件 | 無參數長度限制、遞歸 | 順序不可控 |
find . -name '*.sql' | sort | xargs cat > all.sql | 需排序合併 | 可控順序 | 文件名含空格需 -print0 |
awk 'FNR==1 && NR!=1{next}1' *.sql > all.sql | 合併 CSV/帶表頭文件 | 自動跳過重複表頭 | 僅文本、記憶體佔用大 |
# 錯誤:/usr/bin/cat: Argument list too long
# 解決:find + exec 或 xargs
find /data/sql -name '*.sql' -exec cat {} + > /tmp/merged.sql
# 或分批處理
ls /data/sql/*.sql | xargs -n 1000 cat >> /tmp/merged.sql
# pv 顯示進度
find . -name '*.log' | sort | xargs cat | pv -l > merged.log
# 斷點續傳思路:記錄已處理文件列表
touch processed.list
find . -name '*.log' | sort | while read f; do
grep -qxF "$f" processed.list && continue
cat "$f" >> merged.log
echo "$f" >> processed.list
done
# 檢測編碼
file -bi *.sql | sort -u
# 統一轉 UTF-8 後合併
find . -name '*.sql' -exec sh -c 'iconv -f GBK -t UTF-8 "$1" >> merged.sql' _ {} \;
# 視頻分片合併(需相同編碼參數)
cat video_part_* > video.mp4
# 大文件分卷合併
cat large_file.tar.gz.* > large_file.tar.gz
# 校驗完整性
sha256sum large_file.tar.gz
# 1. 合併並去重(假設每行獨立 INSERT)
cat *.sql | sort -u > merged_unique.sql
# 2. 包裹事務(加速導入)
echo "BEGIN;" > final.sql
cat merged_unique.sql >> final.sql
echo "COMMIT;" >> final.sql
# 3. 分庫分表導入優化
# 使用 mysql 客戶端 source 命令或管道
mysql -u root -p db_name < final.sql
find -print0 | xargs -0 catfind -L 避免無限遞歸cat: permission denied 需 sudo 或調整權限cat 是合併核心,find 提供遞歸與參數長度突破,sort 賦予順序可控,awk 解決表頭去重。**根據文件量級、類型、順序需求組合選型**,並建立「檢測編碼 → 統一編碼 → 分批合併 → 校驗完整性」標準化流程,才能應對 TB 級合併任務。
Linux 百度網盤 bcloud 常見問題解決指南:Keyring 設定、代理配置、介面差異、CLI 擴展
Linux ext3grep 誤刪文件恢復實戰指南:安裝、參數詳解與恢復流程
Linux 環境變數管理實戰:使用 env 指令暫時清空 Bash 環境
Linux Mint 17 Cinnamon 桌面共享設定:dconf-editor 啟用 Vino VNC 伺服器
CentOS 系統時間設定三大方法:本地時間、UTC 與 NTP 同步完整指南
Linux 調整 TCP 本地端口範圍解決佔用衝突:ip_local_port_range 參數實戰