基本上常搭配其它linux指令 (find
, awk
, sed
, grep
…)一起使用,主要是因為一些linux的指令是沒直接支援pipe,所以可以透過xargs
將前面pipe的輸出當成input arguments 給下一個指令使用;
當 xargs
後面沒有接任何的指令時,預設是以 echo
來進行輸出喔
將find的結果,透過xargs
來當作grep
主要要找的對象
find . -name "*.go" -print | xargs grep "src"
-0
flag
-0
flag主要是用來讓xargs
來讓可以去處理需要escape的字元,像是空白字元…
-n
flag
-n
flag 是用來指定每隔多少個要切割成一個pipe的arguments,也就是目前的pipe經過xargs
以後會產生N/n
個pipe(N
為目前pipe的argument數量)。如果沒有設定的話預設為把所有xargs
當下截取到的內容全部收集到目前這個pipe中。
舉例來說,一個env
檔的內容如下:
FOO=123
BAR=456
LOCAL=127.0.0.1
PORT=3000
如果我們沒加-n
flag時,用下面的指令:
cat env| xargs
則輸出結果會是 (env
檔中的4個環境變數會被當成目前這個pipe的argument)
FOO=123 BAR=456 LOCAL=127.0.0.1 PORT=3000
但如果指令改成是下面這樣時
cat env| xargs -n 2
則輸出結果會是 (env
檔的4個環境變數被切割成每2個是一組argument, 並且丟到下一個pipe中,所以這樣就fanout成2個pipe了)
FOO=123 BAR=456
LOCAL=127.0.0.1 PORT=3000
-I
flag
-I
主要是可以用來將截取到的內容,暫存成一個變數名稱,來方便下個指令使用。
以下面的例子來說,會將所有找到的 *.conf
檔案,透過xargs
暫存到變數{}
中,所以接下來的ls -al {}
就可以這樣用…
find /etc/ -name "*.conf" | xargs -I{} ls -al {}
另個例子則是像是備份所有的.conf
檔,則可以透過-I
flag
find /etc/ -name "*.conf" | xargs -I{} cp {} {}.bk
integrate with bash
更彈性的用法是,它可以直接當作bash
的輸入arguments;若一樣以前面的env
檔來當例子,透過以下指令我們可以透過一個簡短的bash
來處理其中的第3個($2
)環境變數。
cat env| xargs bash -c 'export $2'