linux xargs命令的使用及其與exec、管道的區別
阿新 • • 發佈:2018-12-30
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