find之exec和args
本來以為以前的差不多夠用了。呵呵,看到很多高手用高技巧,心癢癢的覺得我自己還可以提升啊。。哈哈哈。
這個實踐起來之后,,SED,AWK也得深化一下,,,SHELL和PYTHON,作運維的兩樣都不能廢。。。
~~~~~~~~~~~~~~~~~~~~~
find . -name "*.txt" -exec rm {} \;
find . -name "*.txt" | xargs rm {}?
-exec
? ? 1.參數是一個一個傳遞的,傳遞一個參數執行一次rm
? ? 2.文件名有空格等特殊字符也能處理
-xargs?
? ? 1.一次將參數傳給命令,可以使用-n控制參數個數
? ? 2.處理特殊文件名需要采用如下方式:
? ? find . -name "*.txt" print0 |xargs -0 rm {}?
~~~~~~~~~~~~~~~
相比之下,也不難看出各自的缺點 1、exec 每處理一個文件或者目錄,它都需要啟動一次命令,效率不好;? 2、exec 格式麻煩,必須用 {} 做文件的代位符,必須用 \; 作為命令的結束符,書寫不便。 3、xargs 不能操作文件名有空格的文件; 綜上,如果要使用的命令支持一次處理多個文件,并且也知道這些文件里沒有帶空格的文件,那么使用 xargs比較方便; 否則,就要用 exec了。 ~~~~~~~~~~~~~~~~~~~~ 一般有2中寫法:
#find ... -exec rm {} \;?
#find ... | xargs rm -rf
兩者都可以把find命令查找到的結果刪除,其區別簡單的說是前者是把find發現的結果一次性傳給exec選項,后者xargs命令會分批次的處理結果。
xargs優點:由于是批處理的,所以執行效率比較高(通過緩沖方式)
xargs缺點:有可能由于參數數量過多(成千上萬),導致后面的命令執行失敗
若換成 find ....-execrm {} \; 的話,
因為rm 是"逐個" item 去處理的, 則無此憂慮
rm不接受標準輸入,所以不能用find / -name "tmpfile" |rm
-exec 必須由一個 ; 結束,而因為通常 shell 都會對 ; 進行處理,所以用 \; 防止這種情況。?
{} 可能需要寫做 '{}',也是為了避免被 shell 過濾。
例子:
cd /home/useway/DataBackup
find ./ -type f -mtime +30 -exec rm -fr {} \; > /dev/null 2>&1
./表示從當前目錄找?
-type f,表示只找file,文件類型的,目錄和其他字節啥的不要
-mtime +30 表示30天前的文件。
-exec 把find到的文件名作為參數傳遞給后面的命令行,代替{}的部分?
-exec后便跟的命令行,必須用“ \;”結束
?/dev/null 2>&1 這樣的寫法.這條命令的意思是將標準輸出和錯誤輸出全部重定向到/dev/null中,也就是將產生的所有信息丟棄. ~~~~~~~~~~~~~~~~~~~~~~~~
一、find 命令格式
1、find命令的一般形式為;
2、find命令的參數;
3、find命令選項
另外,下面三個的區別:
?? -amin n 查找系統中最后N分鐘訪問的文件-atime n 查找系統中最后n*24小時訪問的文件-cmin n 查找系統中最后N分鐘被改變文件狀態的文件-ctime n 查找系統中最后n*24小時被改變文件狀態的文件-mmin n 查找系統中最后N分鐘被改變文件數據的文件-mtime n 查找系統中最后n*24小時被改變文件數據的文件
4、使用exec或ok來執行shell命令
使用find時,只要把想要的操作寫在一個文件里,就可以用exec來配合find查找,很方便的
在有些操作系統中只允許-exec選項執行諸如l s或ls -l這樣的命令。大多數用戶使用這一選項是為了查找舊文件并刪除它們。建議在真正執行rm命令刪除文件之前,最好先用ls命令看一下,確認它們是所要刪除的文件。
exec選項后面跟隨著所要執行的命令或腳本,然后是一對兒{ },一個空格和一個\,最后是一個分號。為了使用exec選項,必須要同時使用print選項。如果驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。
轉載于:https://www.cnblogs.com/aguncn/p/4133924.html
總結
以上是生活随笔為你收集整理的find之exec和args的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【随笔】Win7下GVIM的安装与配置
- 下一篇: 微信公众号教程(13)公司通讯录开发 上