一、xargs做用:shell
(1)將前一個命令的標準輸出傳遞給下一個命令,做爲它的參數,xargs的默認命令是echo,空格是默認定界符express
(2)將多行輸入轉換爲單行安全
二、使用模式:命令行
front command | xargs -option latercommand
front command: 前一個命令get
-option: xargs的選項io
later command: 後一個命令效率
通常與管道「|」結合使用程序
三、xargs經常使用選項command
-n: 指定一次處理的參數個數總結
-d: 自定義參數界定符
-p: 詢問是否運行 later command 參數
-t : 表示先打印命令,而後再執行
-i : 逐項處理
...更多參數查看man xargs
四、xargs與管道|的區別
管道「|」 用來將前一個命令的標準輸出傳遞到下一個命令的標準輸入。
xargs 將前一個命令的標準輸出傳遞給下一個命令,做爲它的參數。
可見,標準輸入與命令參數是不一樣的。我的理解,命令參數就是直接跟在命令後面的,標準輸入能夠是鍵盤,文件等。
因此,管道符 | 所傳遞給程序的不是簡單地在程序名後面輸入的參數,它們會被程序內部的讀取功能如scanf和gets等接收,而xargs則是將內容做爲普通的參數傳遞給程序,至關於直接跟在命令後面。何況,有些命令是不接受標準輸入的,好比kill,rm等命令。
總結:管道符後不加xargs至關於先將xargs後面的命令回車執行一下再從鍵盤裏輸入管道符前面命令執行的結果內容
加上xargs 至關於執行命令(xargs後面的命令)後,直接從鍵盤輸入管道符前面命令執行的結果內容再回車,即管道前面的結果直接跟在xargs 後面的命令後面
再總結一下,就是回車的前後順序不太同樣。
五、xargs與-exec的區別
-exec:{}表示命令的參數即爲所找到的文件,以;表示comman命令的結束。\是轉義符,
由於分號在命令中還有它用途,因此就用一個\來限定表示這是一個分號而不是表示其它意思。
-ok: 和 -exec 的做用相同,格式也同樣,只不過以一種更爲安全的模式來執行該參數
所給出的shell給出的這個命令以前,都會給出提示,讓用戶來肯定是否執行。
#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 {} \;
xargs 要結合管道來完成
格式:find [option] express |xargs command
很明顯,exec是對每一個找到的文件執行一次命令,除非這單個的文件名超過了幾k,不然不
會出現命令行超長出報錯的問題。
而xargs是把全部找到的文件名一股腦的轉給命令。當文件不少時,這些文件名組合成的命
令行參數很容易超長,致使命令出錯。
另外, find | xargs 這種組合在處理有空格字符的文件名時也會出錯,由於這時執行的命令
已經不知道哪些是分割符、哪些是文件名中的空格! 而用exec則不會有這個問題。
總結
相比之下,也不難看出各自的缺點
一、exec 每處理一個文件或者目錄,它都須要啓動一次命令,效率很差;
二、exec 格式麻煩,必須用 {} 作文件的代位符,必須用 \; 做爲命令的結束符,書寫不便。
三、xargs 不能操做文件名有空格的文件;
四、exec參數是一個一個傳遞的,傳遞一個參數執行一次命令;xargs一次將參數傳給命令,可使用-n控制參數個數
五、exec文件名有空格等特殊字符也能處理;xargs不能處理特殊文件名,若是想處理特殊文件名須要特殊處理
綜上,若是要使用的命令支持一次處理多個文件,而且也知道這些文件裏沒有帶空格的文件, 那麼使用 xargs比較方便; 不然,就要用 exec了。