1. 程式人生 > 實用技巧 >Linux xargs命令

Linux xargs命令

xargs預設接echo,直接輸入xargs後,會等待使用者輸入,直到使用者輸入 ctrl+d,才會結束

$ xargs
abc
def
hik       <--- 此處輸入完成後回車,ctrl+d
abc def hik    <-----顯示的結果,將你輸入的內容按照空白字元分割(空格,回車換行等),打印出來

-t:顯示執行的命令

$ xargs -t     # -t 引數:顯示執行的命令
abc
123            # 輸入了abc和123,ctrl+d結束輸入
echo abc 123   # 實際執行的命令是 echo
abc 123

-d 分隔符:分隔符

xargs預設用空格、換行符、製表符等作為分割,把標準輸入分割成一個個命令引數

$ echo 'a b      c' | xargs
a b c          <-- 把上面空格分割,然後打印出來各個引數

自定義分隔:

$ echo 'a b      c' | xargs -d 'b'      <-- 用字元‘b’分割
a        c

-p:使用者確認

-p引數可以在執行命令時,彈出確認訊息,讓使用者確認後才會執行相應的命令

$ echo 'a b      c' | xargs -d 'b' -p
echo a        c
 ?...y               <-- 輸入y,確認
a        c

-n 數量:指定將幾個引數傳遞給命令

不用-n引數

$ echo 'a      b c' | xargs -t echo
echo a b c       # 執行的是 echo a b c,也就是把所有的引數一次性傳遞給了echo
a b c

每次傳遞一個引數,也就是將a b c這三個引數,一個一個的交給echo執行

$ echo 'a      b c' | xargs -n 1 -t echo   # 設定每次傳遞1個引數給echo
echo a          # 看的出來,就傳遞了一個a
a
echo b
b
echo c
c

-i str:給引數的值起個變數名 str,預設是{},官方建議使用-I

先ls一下,檢視檔案

$ ls
aaa  chrome.lnk*  eclipse.lnk*  help.txt  name.txt  Typora.lnk*
$ ls | xargs -i echo "{} .." # 將傳遞進來的引數,用{}代替
aaa ..
chrome.lnk* ..
eclipse.lnk* ..
help.txt ..
name.txt ..
Typora.lnk* ..

-I str:類似-i

$ ls | xargs -I 'name' echo "name ...."  # 將傳遞的引數命名為name
aaa ....
chrome.lnk* ....
eclipse.lnk* ....
help.txt ....
name.txt ....
Typora.lnk* ....

-0:以null作為分隔符

find命令有個引數 -print0,可以將查詢的內容以 null 分割,-0引數可以配合使用

正常的find

$ find -type f
./a b c   e.pub      # 注意這個名字帶有空格的檔案
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

find 命令的 -print0 引數

$ find -type f -print0
./a b c   e.pub./aaa./chrome.lnk./eclipse.lnk./help.txt./name.txt./Typora.lnk  # 以null分割

配合xargs使用,名字帶有空格的檔案,被拆分了!

$ find -type f | xargs -n 1
./a     # 檔名有空格,被拆開了
b
c
e.pub
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

使用 -print0 和 xargs 的 -0

$ find -type f -print0 | xargs -n 1 -0
./a b c   e.pub              # 檔案完好
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

其實上面這個例子不使用 -0 也可以,比如手動指定分隔符為 \n,即回車換行符,而不用預設的空白符號:

$ find -type f| xargs -d '\n' -n 1
./a b c   e.pub
./aaa
./chrome.lnk
./eclipse.lnk
./help.txt
./name.txt
./Typora.lnk

-L 數量:用幾行作為命令引數

-L可以將每行的資料進行分割,然後再把幾行的資料重組,作為一個整體傳遞給下一個命令

下面的例子有三行資料,注意中間的\n,前兩行資料又有很多空格,xargs將這些行進行分割,然後每幾行的引數放到一起,傳遞給下一個命令(預設是echo,顯示訊息)

$ printf "a    b c\nd e     f\nghi" | xargs -L 1
a b c           # a b c,一次傳遞一行引數給echo
d e f
ghi
$ printf "a    b c\nd e     f\nghi" | xargs -L 2 
a b c d e f     # 一次性傳遞了兩行
ghi

-P 數量:一次用幾個程序執行

-P 0 代表不限制幾個程序,-P 2代表用2個程序。