平時使用find命令查找出文件的時候有時候後面有時候用-exec有時候用管道加xargs,這2個到底有什麼不一樣?下面就這2個的不一樣作簡單介紹。shell
零、實驗環境安全
[root@osker /]# find /root/ -type f -name '*.txt' /root/1.txt /root/2.txt /root/3.tx
1、xargs的使用spa
(1)將前一個命令的標準輸出傳遞給下一個命令,做爲它的參數,xargs的默認命令是echo,空格是默認定界符
(2)將多行輸入轉換爲單行
code
[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 )
2、exec的使用blog
exec參數是一個一個傳遞的,傳遞一個參數執行一次命令。
-exec 命令 {} \;
「{}」表示命令的參數即爲所找到的文件;以「;」表示命令的結束,「\」是轉義符,由於分號在命令中還有它用途,因此就用一個\來限定表示這是一個分號而不是表示其它意思。
PS:-ok和-exec的做用相同,格式也同樣,只不過以一種更爲安全的模式來執行該參數,在給出的shell運行這個命令以前,都會給出提示,讓用戶來肯定是否執行。class
[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處理....
3、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短。im
總結:xargs一次將參數傳給命令,能夠使用-n控制參數個數;exec參數是一個一個傳遞的,傳遞一個參數執行一次命令。總結