Linux 自動化基礎之find

Linux 自動化基礎之find

概述

Linux 自動化基礎之find

說起find命令,它很基礎,也很重要,可能大家都用過,但是真正用的還可以應該不多把。

find 參數很多,用好了可以幹很多事情,關於這些參數的詳細信息可以查詢搜索引擎以及瀏覽幫助文檔。本文章蟲蟲會挑一些常用的參數,重點實例介紹。最後用find實現一個腳本,實現自動化日誌清理。

好讓咱們開始介紹。

find 用法:

Linux 自動化基礎之find

find用戶很簡單,最簡單是直接find然後會車,會列出當前目錄下的所有文件和目錄。注意默認就列出所有文件,包括隱藏的文件(以.開頭的文件和目錄)。行為上可以ls –a一樣,但是表現上有差異,結果是以豎向列表和ls –a的橫向展示不一樣。

Linux 自動化基礎之find

對特定目錄搜索的話,是在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

結果如下(各個機器可能結果不一樣)

Linux 自動化基礎之find

3、find . -maxdepth n 搜索深度

表示搜索子目錄的層級,比如1級的話,就會只搜索本目錄,下面顯示和直接find的區別:

Linux 自動化基礎之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出來大小不帶單位的值類似:

Linux 自動化基礎之find

上面截圖展示了,我們搜索大小 5682c的文件,恰好就是ls -al顯示出來的大小5682的 .viminfo文件。

7、-ls 和 –delete

搜素的文件做後續進一步的操作,可以用-ls 和-delet用來列出和刪除選擇的文件用-ls 和 –delete。下面是-ls和ls –al的對比:

Linux 自動化基礎之find

8、find –exec 和 –ok

find –exec 和-ok用來對,搜素的文件做後續進一步的操作。比如刪除文件,可以用$

find . -name 文件名 –type f -exec rm {} \;

注意,我們再第一步時候說的加-type f ,如果不加的話,rm(注意不必要帶-rf,這兒rm是多餘的,看見腳本有帶-rm絕對是學藝不精)會直接刪掉搜索到的文件和目錄,而且不會做提示。-ok會提示,所以手動操作時候建議用-ok,而腳本里面用-exce

Linux 自動化基礎之find

find 和其他命令配合

find 可以和其他命令組合用,比如find搜出來的文件列表,可以用grep 在做下搜索,比如搜索python源文件,還可以用

find /usr -type f |grep "\.py"

可以用find生成文件列表,把列表傳遞個grep 對文件做搜索

比有兩個文件 a,b內容如下:

Linux 自動化基礎之find

我們搜索兩個文件中包含hello word的行:

grep "hello word" `find -type f`

Linux 自動化基礎之find

搜索包含chongchong的行:

grep "chongchong" `find -type f`

Linux 自動化基礎之find

注意上面find -type f外面是反引號,表示執行,就是Esc下面那個符號。

Linux 自動化基礎之find

其他find可以做的事情

藉助find可以做很多事情:

比如我們要刪除目錄下空文件(大小為零的),可以用:

find -type f -size 0 -exec rm {} \;

要刪除30天以前的文件用

find -type f -mtime +30 rm {} \;

Find自動化腳本自動實例

Linux 自動化基礎之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。


分享到:


相關文章: