xargs與exec區別


 平時使用find命令查找出文件的時候有時候后面有時候用-exec有時候用管道加xargs,這2個到底有什么不同?下面就這2個的不同做簡單介紹。

 

零、實驗環境

[root@osker /]# find /root/ -type f -name '*.txt'
/root/1.txt
/root/2.txt
/root/3.tx



一、xargs的使用

(1)將前一個命令的標准輸出傳遞給下一個命令,作為它的參數,xargs的默認命令是echo,空格是默認定界符
(2)將多行輸入轉換為單行

[root@osker /]# find /root/ -type f -name '*.txt'|xargs
/root/1.txt /root/2.txt /root/3.txt
[root@osker /]# find /root/ -type f -name '*.txt'|xargs echo start
start /root/1.txt /root/2.txt /root/3.txt
###-i:逐項處理,默認以空格為分隔符;{}表示前面傳過來的結果。
[root@osker /]# find /root/ -type f -name '*.txt'|xargs -i mv {} {}.bak
[root@osker /]# ll /root/
total 0
-rw-r--r--. 1 root root 0 Apr 16 21:35 1.txt.bak
-rw-r--r--. 1 root root 0 Apr 16 21:35 2.txt.bak
-rw-r--r--. 1 root root 0 Apr 16 21:35 3.txt.bak

###-n: 指定一次處理的參數個數
[root@osker /]# find /root/ -type f -name '*.bak'|xargs -n 2
/root/1.txt.bak /root/2.txt.bak
/root/3.txt.bak

注意:處理特殊文件名需要采用-0來避免特殊字符(xargs -0 )

二、exec的使用

exec參數是一個一個傳遞的,傳遞一個參數執行一次命令。
-exec 命令 {} \;
“{}”表示命令的參數即為所找到的文件;以“;”表示命令的結束,“\”是轉義符,因為分號在命令中還有它用途,所以就用一個\來限定表示這是一個分號而不是表示其它意思。
PS:-ok和-exec的作用相同,格式也一樣,只不過以一種更為安全的模式來執行該參數,在給出的shell運行這個命令之前,都會給出提示,讓用戶來確定是否執行。

[root@osker /]# find /root/ -type f -name '*.bak' -ok echo start {} \;
< echo ... /root/1.txt.bak > ? y
start /root/1.txt.bak
< echo ... /root/2.txt.bak > ? y
start /root/2.txt.bak
< echo ... /root/3.txt.bak > ? y
start /root/3.txt.bak

[root@osker /]# find /root/ -type f -name '*.txt' -exec echo start {} \;
start /root/1.txt
start /root/2.txt
start /root/3.txt

該處理過程為:find命令查找到第一個文件傳給echo處理,然后將查找到的第二個文件傳給echo處理....


三、2個命令在處理的流程上不一樣所以在處理效率上也不同

[root@nfs ~]# touch {1..10000}.txt
[root@nfs ~]# time find ./ -type f -name '*.txt' |xargs rm -f
real    0m0.203s
user    0m0.016s
sys    0m0.186s
[root@nfs ~]# touch {1..10000}.txt
[root@nfs ~]# time find ./ -type f -name '*.txt' -exec rm {} \;
real    0m8.074s
user    0m3.717s
sys    0m4.294s

可以看到xargs在處理大量文件上時間比exec短。




總結:xargs一次將參數傳給命令,可以使用-n控制參數個數;exec參數是一個一個傳遞的,傳遞一個參數執行一次命令。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM