天天看點

shell中exec 、xargs與管道之間的差別

xargs

1、作用:

将前一個指令的結果作為參數傳給下一個指令,能夠接受大量參數傳送,比如可以參數數量一百萬,這是就隻能使用xargs了,而exec就不可以了

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

front command: 前一個指令

-option: xargs的選項

later command: 後一個指令

一般與管道“|”結合使用

3、xargs常用選項

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

-d: 自定義參數界定符

-p: 詢問是否運作 later command 參數

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

-i : 逐項處理

4、xargs與管道|的差別

管道“|” 用來将前一個指令的标準輸出傳遞到下一個指令的标準輸入。

xargs 将前一個指令的标準輸出傳遞給下一個指令,作為它的參數。

可見,标準輸入與指令參數是不同的。個人了解,指令參數就是直接跟在指令後面的,标準輸入可以是鍵盤,檔案等。

是以,管道符 | 所傳遞給程式的不是簡單地在程式名後面輸入的參數,它們會被程式内部的讀取功能如scanf和gets等接收,而xargs則是将内容作為普通的參數傳遞給程式,相當于直接跟在指令後面。況且,有些指令是不接受标準輸入的,比如kill,rm等指令。

總結:管道符後不加xargs相當于先将xargs後面的指令回車執行一下再從鍵盤裡輸入管道符前面指令執行的結果内容

加上xargs 相當于執行指令(xargs後面的指令)後,直接從鍵盤輸入管道符前面指令執行的結果内容再回車,即管道前面的結果直接跟在xargs 後面的指令後面

再總結一下,就是回車的先後順序不太一樣。

5、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則不會有這個問題。

相比之下,也不難看出各自的缺點

1、exec 每處理一個檔案或者目錄,它都需要啟動一次指令,效率不好;

2、exec 格式麻煩,必須用 {} 做檔案的代位符,必須用 ; 作為指令的結束符,書寫不便。

3、xargs 不能操作檔案名有空格的檔案;

4、exec參數是一個一個傳遞的,傳遞一個參數執行一次指令;xargs一次将參數傳給指令,可以使用-n控制參數個數

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

綜上,如果要使用的指令支援一次處理多個檔案,并且也知道這些檔案裡沒有帶空格的檔案,

注意:

exec的使用格式:front command exec later command {} ;

那麼使用 xargs比較友善; 否則,就要用 exec了。

版權聲明:本文為CSDN部落客「appke8461」的原創文章,複制别人的文章,自己用來做筆記的,記錄自己在遇到這個問題遇到的坑。欲找原文,請點選下方傳送門

原文連結:https://blog.csdn.net/appke846/article/details/80585469