一、背景說明
項目上應用或者數據庫服務器的存儲空間基本是先定好的,隨着時間的推移,應用服務產生的log日志或者數據庫的歸檔日志都有可能存在撐爆磁盤空間的問題。鑒於此,對於應用日志之前有說過可以通過自動轉儲的方式來處理,這個方法用於歸檔日志就不太適合。為此我們常用的方法是准備一個專門的用於做存儲的設備,例如華為雲的OBS服務,來存儲歸檔日志,這也是因為專門的OBS存儲庫會比添加磁盤的成本要便宜,也是異地存儲,然后按照要求定時的將歸檔日志遷移到OBS存儲庫中。當然對於一些不重要的測試庫來說可以定時的刪除過期的歸檔日志,應用服務的日志也同樣適用,為此我們用find命令來查找一定時間要求的日志文件來遷移或者刪除,例如做個定時任務每天定時刪除7天前的日志。
二、一些文件時間屬性說明
1、atime、ctime、mtime區別
- atime是指access time,指文件中的數據最后被訪問的時間
- ctime即change time文件狀態改變時間,指文件的元數據發生變化的時間,比如權限、所有者等,通過chmod修改文件屬性,ctime就會被修改。
- mtime即modify time,指文件內容被修改的最后時間。
2、查看文件的時間等屬性
-
使用
stat filename命令可以查看到這三個時間屬性,有興趣的可以自己創建一個文件,然后分別通過訪問(如cat)、修改內容(echo >>)、修改屬性(chmod)來測試這三個時間屬性的變化情況
[NOTE]
與atime,ctime,mtime類似,以分鍾為單位的時間范圍查找對應的參數為amin,cmin,mmin。
三、查找指定時間要求的文件
先看下find --help的介紹

-
查找某個時間段內的文件,例如查找2020-04-01到2020-04-13號之間的文件,使用如下命令即可:
find /log/ -name 'test.log*' -newermt '2020-04-01' ! -newermt '2020-04-13' -
找出 3 天“以前”被改動過的文件(> 72 小時)
find /var/log/ -mtime +3 -type f -print -
找出前 3 天內被改動過的文件(0 ~ 72 小時內)
find /var/log/ -mtime -3 -type f -print -
找出前第 3 天被改動過的文件(72 ~ 96 小時)
find /var/log/ -mtime 3 -type f -print
find /var/log/ -mtime +2 -mtime -4 -type f -print
[NOTE]
+n 表示n天之前;-n 表示n天以內;n 表示第n天的時候。
四、實際應用
1、Linux查找某個時間內的文件並刪除
/usr/bin/find /pg_backup/archive_wals -name "*.lz4" -mtime +35 |xargs rm -rf
/usr/bin/find /pg_backup/archive_wals -name "*.lz4" -mtime +35 -exec rm -rf {} \;
可以配合定時任務一起使用,其中 |xargs rm -rf 和 -exec rm -rf {} \; 作用相似,即通過前面的條件查找出35天前的文件,將結果返回給后面的語句進行處理,即刪除。前者是查出一條刪除一條,后者是查出之后作為整體放到{}內進行刪除,這樣當文件數量較多的時候,就可能會出現“參數太多”之類的錯誤,建議一般選擇前者。
[NOTE]
rm不接受標准輸入,所以不能用find / -name "tmpfile" |rm后面需要加-rf;
-exec必須由一個;結束,而因為通常shell都會對;進行處理,所以用\;防止這種情況。{}可能需要寫做'{}',也是為了避免被shell過濾。
2、Linux查找某個時間內的文件並復制到指定目錄
*/10 * * * * /usr/bin/find /u01/pgdata/12/archive_wals/ -name "*.lz4" -mmin -10 |xargs -I {} cp {} -u -t /obs-mountpoint/postgresql/backups/archive_wals/
每10分鍾將前10分鍾之內的文件cp到指定目錄,其中 -u 表時cp時遇到相同文件更新替換,-t 復制所有的源文件到目錄。
