您好,登錄后才能下訂單哦!
-exec與xargs常和find聯合在一起使用,實現對文件的操作。
-exec是find的一個選項,而不是exec命令。對于find命令,其命令選項參數非常特別,不是常見的UNIX-style的單字母選項,而采用了由單詞構成,專業點說是指示性選項(predicate),這構成了一種新的UNIX-style命令語法規范。
find為啥要加-exec,這又得談下UNIX-sytle,UNIX特別強調命令的功能和魔法,喜歡用一個命令實現多個功能。所以,高手們也特中意于單行命令,盡管不惜用管道不斷地把多個命令串起來。我想,開發find命令的大佬肯定是覺得單find到東西太簡單了,體現不了自己UNIX-sytle的范兒,所以就加上-exec這個選項,對find到的東西做進一步的靈活操作。
BTW,多了解些UNIX-style,你就逐步認識融入UNIX文化,對各種命令有了從骨子上的認識,應用起來會更加得心應手。
xargs與-exec明顯不同,xargs可是單個的命令,功能要更加強大。xargs從字面上理解為,args表示多個參數(arguments),有了多個參數,就可聯想到參數列表。最前面的x表示執行或操作(eXecute)。綜合起來,就是對參數列表進行操作。
簡單地看,-exec是找到一個文件就執行一次命令操作,xargs則是先把所有文件都找齊,再統一進行命令操作。舉個例子,對于要find到1000個文件進行grep操作,find會為找到的第一個文件fork出一個子進程,這個子進程再進行grep操作。這時,find主進程卻在等待,等到fork出去的子進程grep操作完成了,再進行下一個文件的尋找。這是個很休閑的處理方式。xargs命令卻不同,xargs是一次找齊了所有文件,再用一個grep命令一次操作搞定。至于xargs對超長的參數列表還要進行分組,就不細談了。
xargs明顯比-exec的效率要高出不少。舉個實際例子PK,一見高下。
- [root@localhost ~]# time find /usr/include -type f -exec grep NFS_VERSION {} \;
- version NFS_VERSION {
- #define NFS_VERSION 2
- real 0m17.328s
- user 0m5.418s
- sys 0m8.421s
- [root@localhost ~]# time find /usr/include -type f|xargs grep NFS_VERSION
- /usr/include/rpcsvc/nfs_prot.x: version NFS_VERSION {
- /usr/include/rpcsvc/nfs_prot.h:#define NFS_VERSION 2
- real 0m0.095s
- user 0m0.031s
- sys 0m0.061s
看sys指標,8.421s vs 0.061s, 140倍的差距。
xargs很強大,但使用時若碰到命名不規范的文件命名,就會發生問題,比如"a b.txt",它會理解成"a"和"b.txt"2個文件,解決的方法是在find中加"-print0"選項(注意是數字0,find的選項可都是由單詞構成的,所以是print0,一個復合詞嘛),意思找到一個文件就在文件名加上空字符('\0'),做為文件分割符,然后還必須在xargs加上"-0"選項,表示前面find過來的文件參數列表時是用'\0'做為文件分割符的,這樣就能正確地識別區分每個文件了。上例中,較規范的寫法就變為:
- [root@localhost ~]# time find /usr/include -type f -print0 |xargs -0 grep NFS_VERSION
- /usr/include/rpcsvc/nfs_prot.x: version NFS_VERSION {
- /usr/include/rpcsvc/nfs_prot.h:#define NFS_VERSION 2
- real 0m0.102s
- user 0m0.036s
- sys 0m0.065s
這里面又揭示出一個矛盾,文件命名和對文件的識別操作問題之間的矛盾。UNIX-sytle可是對文件的命名規則放得相當寬松哦,搞得好像是沒有規范,后續若遇到文件名的問題再想辦法解決。大家會試問,為啥不先對文件命名進行嚴格規范,免得后續操作麻煩。但是,UNIX的一個核心理念就是文件,文件命名當然要放得開,這樣就滿足了不同的文件命名需求,至于文件名帶來的麻煩,先不管,放在一邊,以后誰碰到誰解決,這就是UNIX文化。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。