1. 程式人生 > >linux xargs命令的使用及其與exec、管道的區別

linux xargs命令的使用及其與exec、管道的區別

1、作用:

(1)將前一個命令的標準輸出傳遞給下一個命令,作為它的引數,xargs的預設命令是echo,空格是預設定界符

(2)將多行輸入轉換為單行

2、使用模式:front command | xargs -option later command

front command: 前一個命令

-option:xargs的選項

later command: 後一個命令

3、xargs常用選項

-n:指定一次處理的引數個數

-d:自定義引數界定符

-p:詢問是否執行 later command 引數

-t :表示先列印命令,然後再執行

-i :逐項處理

...更多引數檢視man xargs

4、使用例項

測試文字:xargs.txt

a b c d e f g 
h i j k l m n 
o p q
r s t
u v w x y z
(1)多行輸入單行輸出
cat xargs.txt | xargs


( 2)指定一次處理的引數個數:指定為5,多行輸出

cat xargs.txt | xargs -n 5


(3)自定義引數界定符:指定界定符為'm'

cat xargs.txt | xargs -d m


(4)詢問是否執行 later command 引數

cat xargs.txt | xargs -n 5 -p


(5)將所有檔案重新命名,逐項處理每個引數

ls *.txt |xargs -t -i mv {} {}.bak


更多引數選項檢視man xargs

5、xargs與管道|的區別

| 用來將前一個命令的標準輸出傳遞到下一個命令的標準輸入,xargs 將前一個命令的標準輸出傳遞給下一個命令,作為它的引數。

#使用管道將ls的結果顯示出來,ls標準輸出的結果作為cat的標準輸出
ls | cat
#使用xargs將ls的結果作為cat的引數,ls的結果為檔名,所以cat 檔名即檢視檔案內容
ls | xargs cat


6、xargs與exec的區別

(1)exec引數是一個一個傳遞的,傳遞一個引數執行一次命令;xargs一次將引數傳給命令,可以使用-n控制引數個數

#xargs將引數一次傳給echo,即執行:echo begin ./xargs.txt ./args.txt
find . -name '*.txt' -type f | xargs echo begin
 #exec一次傳遞一個引數,即執行:echo begin ./xargs.txt;echo begin ./args.txt
find . -name '*.txt' -type f -exec echo begin {} \;

(2)exec檔名有空格等特殊字元也能處理;xargs不能處理特殊檔名,如果想處理特殊檔名需要特殊處理

#find後的檔名含有空格
find . -name '*.txt' -type f | xargs cat
find . -name '*.txt' -type f -exec cat {} \;


原因:預設情況下, find 每輸出一個檔名, 後面都會接著輸出一個換行符 ('\n'),因此我們看到的 find 的輸出都是一行一行的,xargs 預設是以空白字元 (空格, TAB, 換行符) 來分割記錄的, 因此檔名 ./t t.txt 被解釋成了兩個記錄 ./t 和 t.txt, cat找不到這兩個檔案,所以報錯,為了解決此類問題,  讓 find 在打印出一個檔名之後接著輸出一個 NULL 字元 ('') 而不是換行符, 然後再告訴 xargs 也用 NULL 字元來作為記錄的分隔符,即 find -print0 和 xargs -0 ,這樣就能處理特殊檔名了。
#xargs處理特殊檔名
find . -name '*.txt' -type f -print0 | xargs -0  cat