shell指令碼自動清理超過指定大小的檔案

2021-07-25 05:26:19 字數 3625 閱讀 7833

先說下背景:我們線上用的squid,根據經驗值如果長時間執行則快取目錄下的swap.state會慢慢變大,一旦超過60m,squid的效能就會急劇下降,因此需要定時去清理大於60m的swap.state檔案。

由此引出需求,查詢cache目錄下的所有大於60m的swap.state檔案並清除,即:

1.查詢cache目錄下的所有swap.state檔案

2.判斷是否大於60m

3.大於60m則清空

相關squid配置如下:

cache_dir coss /data/cache1/coss 120000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100

cache_dir aufs /data/cache1 30000 128 128 min-size=1000000

cache_dir coss /data/cache2/coss 180000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100

cache_dir aufs /data/cache2 50000 128 128 min-size=1000000

cache_dir coss /data/cache3/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100

cache_dir aufs /data/cache3 50000 128 128 min-size=1000000

cache_dir coss /data/cache4/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100

cache_dir aufs /data/cache4 50000 128 128 min-size=1000000

cache_dir coss /data/cache5/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100

cache_dir aufs /data/cache5 50000 128 128 min-size=1000000

cache_dir coss /data/cache6/coss 200000 max-size=1000000 block-size=4096 membufs=100 overwrite-percent=100

這裡稍微說下,由於我們配置了coss,所有swap.state主要是在coss目錄下,同時我們採用了多程序squid,因此coss目錄下存在squid1-squid6等目錄。

第一想到的則是常用的du -sh命令: du -sh /data/cache*/coss/squid*/swap.state ,輸入如下:

[root@crn-jz-2-36x ~]# du -sh /data/cache*/coss/squid*/swap.state 2.7m /data/cache1/coss/squid1/swap.state

270k /data/cache1/coss/squid2/swap.state

2.7m /data/cache1/coss/squid3/swap.state

2.7m /data/cache1/coss/squid4/swap.state

53m /data/cache1/coss/squid5/swap.state

35m /data/cache1/coss/squid6/swap.state

5.6m /data/cache2/coss/squid3/swap.state

4.6m /data/cache2/coss/squid4/swap.state

122m /data/cache2/coss/squid5/swap.state

4.4m /data/cache3/coss/squid4/swap.state

97m /data/cache3/coss/squid5/swap.state

75m /data/cache3/coss/squid6/swap.state

5.4m /data/cache4/coss/squid1/swap.state

74m /data/cache4/coss/squid6/swap.state

…可以發現,/data/cache4/coss/squid6/swap.state 等大於60m的swap.state為我們需要清理的目標。

當時就很自然的採用如下方案去實現:

du -sh /data/cache*/coss/squid*/swap.state | awk 『 『  | awk -f』m』 『 『

思路如下:使用du -sh 查詢大於swap.state的大小,同時使用awk 過濾第乙個字段,接著為了過濾掉m、只保留數字,再次使用awk 制定」m」作為分界符過濾出檔案大小。

輸入如下:

270k

2.72.7

5335

5.64.6

1224.4

9775

5.474

可以看出du -sh這種方案的缺點,du -sh 的 輸入會自動轉換單位,k、m、g,只過濾m會導致部分檔案大小無法正常獲取,例如第乙個的270k。同時使用了多個管道較為繁瑣,

且管道過濾之後的只有檔案大小,相對應的檔名丟失,後續的處理較麻煩,當然也可以使用陣列等解決。故放棄此方案。

問了個朋友有沒有好點的方法去處理,他提示我說不要使用帶單位的輸出,直接ls -l 的輸出就可以作為相應的資料來源。ls -l輸出的結果以位元組為單位,簡單,容易處理。

這裡同時考慮到第乙個方案的缺點,因此加了兩個臨時變數去儲存相應的檔名、檔案大小。附上最後的方案:

ls -l /data/cache*/coss/squid*/swap.state | while read i;  do size=`echo $i | awk 『 』`; file=`echo $i | awk 『 』`;  if [ $size -gt 61865984 ] ; then echo >$file ; fi;done

61865984 位元組換成成m單位為60m,這裡判斷是否大於60m,大於則使用echo 語句將對應檔案置空。

將單行shell整理成可讀性較強的指令碼:

#! /bin/bash

ls -l /data/cache*/coss/squid*/swap.state | while read i;

dosize=`echo $i | awk 『 』`; file=`echo $i | awk 『 』`;

#here the 61865984 byte is equal to 60m

if [ $size -gt 61865984 ] ;

then

echo $file; echo $size

#clean it

echo >$file

fidone

好吧,其實這篇部落格最主要的內容就是我犯了個很傻很天真的錯誤,採用du -sh這種帶自動單位換成的命令去處理,麻煩多多。有時候還是簡單的ls 好啊。

後續的引申可以再將次腳步稍微整理下,加上簡單的清理日誌記錄,同時掛上計畫任務,這樣就可以自動去清理了。同時類似的,以後類似的需求,

均可以由此指令碼簡單修改而實現。

自動清理超過指定大小的檔案 shell指令碼

使用du命令實現 生成幾個測試檔案 root localhost cache dd if dev zero of testfile1 bs 1m count 50 50 0 records in 50 0 records out 52428800 bytes 52 mb copied,0.14518...

Linux下自動清理超過指定大小檔案

掃瞄某個目錄下的檔案,發現超過指定大小即清空 1 掃瞄目錄下的檔案 2 判斷檔案大小 3 清空大於指定檔案的內容 以byte為單位顯示檔案大小,然後和20m大小做對比.20m換算成位元組為20971520這裡判斷是否大於20m,大於則使用echo 語句將對應檔案置空 20m 20 1024 1024...

定時清理檔案shell指令碼

乙個測試機上部署多個應用,總是經常出現磁碟空間已滿,不能部署應用的情況,所以寫了個小指令碼,用於定時清理日誌,避免出現這種情況。1 如果是清理固定路徑下的檔案,可以直接用命令方式。命令方式 1 編寫命令 find logs name catalina.out log and mtime 7 測試方法...