概述
說起find命令,它很基礎,也很重要,可能大家都用過,但是真正用的還可以應該不多把。
find 參數很多,用好了可以幹很多事情,關於這些參數的詳細信息可以查詢搜索引擎以及瀏覽幫助文檔。本文章蟲蟲會挑一些常用的參數,重點實例介紹。最後用find實現一個腳本,實現自動化日誌清理。
好讓咱們開始介紹。
find 用法:
find用戶很簡單,最簡單是直接find然後會車,會列出當前目錄下的所有文件和目錄。注意默認就列出所有文件,包括隱藏的文件(以.開頭的文件和目錄)。行為上可以ls –a一樣,但是表現上有差異,結果是以豎向列表和ls –a的橫向展示不一樣。
對特定目錄搜索的話,是在find 後緊跟要搜索的目錄,比如搜索/usr 就是find /usr
下面是find用法的一般格式:
用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [ path...] [expression]
關於參數我就說幾個比較重要的:
1、-type 用於搜索的類型
d為目錄 ,l 為軟鏈接,f 為文件,b塊設備,s socket套接字文件 p
fifo命名管道,其中f用的最多。
比如搜索/usr的文件,就用
find /usr -type f
2、-name 文件名 搜索文件名
這個是find最常用的模式。為啥呢?因為find最常用就是搜索文件名,都是用這個。注意文件名是支持泛查詢的,比如要查詢python原文件,可以用:
find /usr/ -type f -name *.py
結果如下(各個機器可能結果不一樣)
3、find . -maxdepth n 搜索深度
表示搜索子目錄的層級,比如1級的話,就會只搜索本目錄,下面顯示和直接find的區別:
4、-mtime n 文件修改時間
類似的有-atime 創建時間和 -ctime 訪問時間以及其他以分鐘為單位的。為啥這個常用呢,主要用它查文件變化,比如網站目錄被篡改了,用這個一查就查的到。
比如網站目錄中,我們要查找下最近7天內變化的文件,就可以用下面的命令(假設網站更目錄為/web):
find /web -type f -mtime -7
注意 -mtime 後面數字n 表示n天 +n表示超過n天 ,-n表示n天內。
5、-perm 格式 根據權限查找
格式支持常見的數字
find ~ -perm 0700 查找你當前用戶目錄下文件權限為用戶可讀寫執行的。
6、-size (+-)n[mkc],根據文件大小查詢
比如查詢文件大小為小於10k的
find ~ -size -10k
注意,加減表示大於小於不帶的話是恰好,m是兆字節,k是千字節,c字節,這個值和默認ls -l出來大小不帶單位的值類似:
上面截圖展示了,我們搜索大小 5682c的文件,恰好就是ls -al顯示出來的大小5682的 .viminfo文件。
7、-ls 和 –delete
搜素的文件做後續進一步的操作,可以用-ls 和-delet用來列出和刪除選擇的文件用-ls 和 –delete。下面是-ls和ls –al的對比:
8、find –exec 和 –ok
find –exec 和-ok用來對,搜素的文件做後續進一步的操作。比如刪除文件,可以用$
find . -name 文件名 –type f -exec rm {} \;
注意,我們再第一步時候說的加-type f ,如果不加的話,rm(注意不必要帶-rf,這兒rm是多餘的,看見腳本有帶-rm絕對是學藝不精)會直接刪掉搜索到的文件和目錄,而且不會做提示。-ok會提示,所以手動操作時候建議用-ok,而腳本里面用-exce
find 和其他命令配合
find 可以和其他命令組合用,比如find搜出來的文件列表,可以用grep 在做下搜索,比如搜索python源文件,還可以用
find /usr -type f |grep "\.py"
可以用find生成文件列表,把列表傳遞個grep 對文件做搜索
比有兩個文件 a,b內容如下:
我們搜索兩個文件中包含hello word的行:
grep "hello word" `find -type f`
搜索包含chongchong的行:
grep "chongchong" `find -type f`
注意上面find -type f外面是反引號,表示執行,就是Esc下面那個符號。
其他find可以做的事情
藉助find可以做很多事情:
比如我們要刪除目錄下空文件(大小為零的),可以用:
find -type f -size 0 -exec rm {} \;
要刪除30天以前的文件用
find -type f -mtime +30 rm {} \;
Find自動化腳本自動實例
最後舉個自動化實例,nginx日誌分割和過期日誌清理:
# 0 00 * * * /nginx/logs/ngx_logcut.sh >/dev/null 2>&
pidfile=/var/run/nginx.pid
logpath='/nginx/logs/'
keepdays=30
logfiles=(access.log error.log)
cd $logpath
for logfile in ${logfiles[@]}; do
if [ ! -e $logfile ];
then
continue
fi
find . -type f -name $logfile"20*" -mtime +$keepdays -exec rm {} \;
mv $logfile $logfile$(date -d "yesterday" +"%Y%m%d")
done
kill -USR1 `cat $pidfile`
以上腳本保存為/nginx/logs/ngx_logcut.sh為,然後在cron添加一條0 00 * * * /nginx/logs/ngx_logcut.sh >/dev/null 2>& 會每天0點做日誌切割,並把超過30天的日誌刪除掉。
設置參數說明:
pidfile nginx 進程號pid的文件
logpath目錄是nginx的日誌目錄,可以根據自己實際修改。
keepdays是日誌保存的時間,設置保存多少天就ok。
主要邏輯是:
find尋找文件,刪除。
把當前的日誌,mv到日誌名稱打時間籤。
kill -USR1 nginxpid 這個是個nginx消息,nginx會重新加載配置,類似於nginx -s reload。
閱讀更多 蟲蟲安全 的文章