xargs — 從標準輸入建構並執行指令

將標準輸入轉為指令參數,批次或平行執行指令。

語法

xargs [選項] [指令 [初始參數]]

常用選項

選項 說明 範例
-0, --null 以 null 字元分隔輸入(配合 find -print0 處理含空格的路徑) find . -name "*.txt" -print0 | xargs -0 rm
-I 替代字串 指定替代字串,每次替換為一個輸入項目 ls | xargs -I{} cp {} /backup/
-n N 每次傳遞最多 N 個參數 echo "a b c d" | xargs -n 2 echo
-P N 平行執行,最多 N 個程序同時執行 cat urls.txt | xargs -P 4 -I{} wget {}
-t, --verbose 執行前顯示指令(除錯用) echo "a b" | xargs -t echo
--dry-run / -t 顯示會執行的指令,不實際執行 ls *.log | xargs -t rm
-r, --no-run-if-empty 若輸入為空則不執行 echo "" | xargs -r rm

使用範例

範例 1:批次刪除符合條件的檔案

配合 find -print0 和 xargs -0 處理任意檔名(含空格)。

$ find /tmp -name "*.tmp" -older /tmp -print0 | xargs -0 rm -v
removed '/tmp/cache.tmp'
removed '/tmp/build123.tmp'
範例 2:批次操作(-I 替代字串)

用 -I{} 讓每個輸入項目替換 {},執行對應的操作。

$ ls *.jpg | xargs -I{} convert {} -resize 800x600 resized/{}
範例 3:平行下載多個 URL

用 -P 4 同時啟動 4 個 wget 程序平行下載,大幅提升效率。

$ cat download-list.txt | xargs -P 4 -n 1 wget -q
範例 4:搜尋並在多個檔案中取代

找出含有 "old_config" 的檔案,再用 sed 批次取代。

$ grep -rl "old_config" ./config/ | xargs sed -i "s/old_config/new_config/g"
範例 5:每次傳遞 N 個參數

用 -n 2 讓 xargs 每次只傳 2 個參數給指令,方便觀察行為。

$ echo "1 2 3 4 5 6" | xargs -n 2 echo
1 2
3 4
5 6

常見錯誤與排錯

輸入含空格的路徑時,xargs 把路徑分割了
原因
預設以空白和換行分隔,含空格的路徑會被錯誤分割。
解法
使用 find -print0 搭配 xargs -0(null 字元分隔)處理含空格路徑。

延伸閱讀