2007年12月26日 星期三

自動刪除過期備份檔(Autodelete Expired BAK Files)

還記得我在前文「區網更新病毒碼」一文中,自己弄了個小的批次檔來自動抓取病毒碼解壓縮更名備份的動作。

不過真正的問題還沒解決,因為那個備份的動作,如果沒有刪除機制可以配合(一般來說,只能定期清空某個特定資料夾),如此檔案就會日經月累而肥大(尤其是資料庫的備份)。

雖然可以透過一些規畫來保留幾天前的檔案,但是我還是希望能夠透過相關的批次檔來解決,老實說,我這幾天就是在想這東西...(目前仍有瓶頸尚待突破)

不過,我自認DOS下的批次檔撰寫能力還不夠火候,目前只能先採用別的方式來解決這問題,例如透過LINUX所提供的指令來解決這棘手的問題。(雖然也有些FREEWARE可以達到此訴求)

雖然網路上有不少是透過VBScript或是其它的方式來達成,我只是想要試看看究竟有沒有辦法以原生的NTVDM(Windows 虛擬 DOS 機器)弄一個出來...(還在努力中)

這裡提供兩個方式來營造這樣子的工作環境

1.更新的WINDOWS主機之外,另外架一台LINUX主機。
2.在WINDOWS下安裝Cygwin的套件來虛擬LINUX平台來運行指令。

目標:自動清除超過五天以上的備份檔案

1.LINUX:利用基本指令(進階)就能達成。
2.WINDOWS(非SERVER版):需撰寫批次檔才能完成。(殘念中...)

PS:SERVER版的WINDOWS可透過一個Forfiles的指令來判斷檔案的日期。

採用的LINUX指令就是find就可以了,因為在LINUX下的find就可以針對檔案的日期來做尋找及篩選,同時把結果拋到後面的指令來處理。

說穿了,如果是透過LINUX的指令的話...只要一條指令就可以自動刪除五天前舊的備份檔案,指令如下:

find /backup/ -mtime +5 -exec rm -rf {} \;

說明:
(1)find /backup/:搜尋資料夾(/backup/)。
(2)-mtime +3:三天內未變動過的檔案。
(3)-exec command {} \;:執行指令(command)和結束(\;)。
(4)rm -rf {}:強制刪除find所搜尋到的檔案。

其實就這樣一條短短的指令就可以解決這個問題,其實還有很多不同的應用,如果真的要深入討論的話,可能又一篇很長的文章。

如果你是採用第一種工作環境(一台WINDOWS+一台LINUX),只要把WINDOWS的D:/BACKUP/ 資料夾開放分享,再用LINUX載掛(mount)(注意權限問題),就可以透過LINUX的find指令加上自動排程(cron)就可以達到此目標。

如果是採用第二種的話,可能就要動點小小的手腳了...

1.首先你得到Cygwin官網,下載一個setup.exe回來(我只是把連結加上,怕有問題的可自行下載),然後執行。

2.執行後,先點選下一步,可以進到三個選項的畫面:
 (1)Install from Internet:網路安裝
 (2)Download Without Installing:下載並不安裝
 (3)Install from Local Directory:從電腦的資料夾中安裝

基本上,選(1)的人它會自動幫你安裝在你所指定的資料夾內,而選(2)的人,就得繼續(3)的動作,視你身處環境不同而不同。(安裝相關問題可參照官網說明)

裝完後再用個小批次檔+自動排程就可以讓它自行解決...

說明:
(1)Cygwin的安裝路徑為:d:\cygwin
(2)find.bat的內容:
@echo off
ECHO 自動執行Cygwin
ECHO 將find.txt的指令匯入Cygwin
d:\cygwin\Cygwin.bat

(3)find.txt的內容:
find /cygdrive/d/backup/ -mtime +5 -exec rm -rf {} \;
exit

說明:Cygwin內對於WINDOWS的磁碟機放在/cygdrive/下。

老實說,這篇的重點是想要引起大家的興趣,回來看看如果只用DOS的話,要怎麼來達成這個目標而已...我有看到用別的程式只要短短幾行就解決的,如果有人對純DOS下透過批次檔的撰寫可以完成此目標的人,歡迎指教並告知筆者,在此萬分感謝。