Linux xargs命令
阿新 • • 發佈:2020-07-29
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個程序。