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 字元分隔)處理含空格路徑。