xargs 將標準輸入轉為命令列參數,分批執行,完美解決 find -exec 參數列表過長、進程過多問題。本文詳細說明 xargs 核心參數、返回碼對照表、與 find、grep、awk 組合的 8 大實戰場景。

-n N 每次最多傳遞 N 個參數
-P N 並行執行 N 個進程 (GNU xargs)
-0 以 null 字元分隔 (配合 find -print0)
-I {} 佔位符,支援多次引用
-t 顯示即將執行的命令
-p 互動確認每次執行
-r 無輸入時不執行命令
-s N 最大命令列長度 (預設 131072)
| 碼 | 含義 |
|---|---|
| 0 | 成功 |
| 123 | 任一子命令返回 1-125 |
| 124 | 子命令返回 255 |
| 125 | 子命令被訊號殺死 |
| 126 | 子命令無法執行 (權限/不存在) |
| 127 | 子命令未找到 |
| 1 | 其他錯誤 |
| >128 | Shell 致命訊號 (128+signo) |
find /var/log -name "*.log" -mtime +30 -print0 | xargs -0 -r rm -ffind . -name "*.csv" -print0 | xargs -0 -P 4 -n 1 gzipls *.JPG | xargs -I {} mv {} {}.jpggrep -rl "TODO" src/ | xargs -r sed -i 's/TODO/FIXME/g'ps -u www -o pid= | xargs -r kill -9find . -name "*.go" -print0 | xargs -0 wc -lcat dirs.txt | xargs -r mkdir -pfind . -name "*.txt" -print0 | xargs -0 -I {} iconv -f GBK -t UTF-8 {} -o {}.utf8| 指標 | find -exec cmd {} + | find ... | xargs cmd |
|---|---|---|
| 參數長度限制 | 核心自動分批 | xargs 內部分批 |
| 進程數 | 單一進程 | 單一進程 (或 -P 並行) |
| 錯誤處理 | 較難捕捉 | 可檢查 xargs 返回碼 |
| 可讀性 | 較直觀 | 管線風格更 Unix |
掌握 xargs 即擁有「Unix 管線瑞士刀」,批次處理百萬級檔案亦游刃有餘。