我們先假設以下的檔案結構:
c:\a-root
|______job1.log (create date: 2009-10-13 16:00)
|______jog2.log (create date: 2009-10-13 16:03)
|____\log
|______\20090912 (zip date: 2009-09-13 18:01)
|________job1.log
|________jog2.log
|______\20090927(zip date: 2009-09-28 18:28)
|________job1.log
|________jog2.log
|____\data
|______Tw090902.zip (create date: 2009-09-02 21:09)
|______Tw090909.zip (create date: 2009-09-09 21:22)
|______Tw090910.zip (create date: 2009-09-10 21:05)
|______Tw090913.zip (create date: 2009-09-13 21:29)
|______Tw090914.zip (create date: 2009-09-14 21:27)
|______Tw091008.zip (create date: 2009-10-08 21:09)
|______Tw091009.zip (create date: 2009-10-09 20:58)
|______Tw091012.zip (create date: 2009-10-12 20:57)
|______Tw091013.zip (create date: 2009-10-13 20:52)
現在要達成的目標:每天23:59執行1次批次轉檔並希望將舊的資料檔以及LOG檔做備份以及過舊處理。例如每個月1號把上個月的檔案們通通刪除。
在ANT裡我們可以使用<format>來轉換日期成成字串用來判斷檔案名稱,例如:
<format property="today" pattern="yyyyMMdd" locale="tw" /> 可以將台灣地區的系統當日做出20091013的字串格式。
也可以加入offset、unit 達到日期增加、減少的計算能力,例如:
<format property="deleteDay" pattern="yyyyMMdd" offset="-15" unit="day" locale="tw" /> 表示取得台灣地區的系統當日(2009/10/13)之後再減15天,做出20090928的字串格式。那麼如果想要減少一個月呢? unit="month" offset="-1" 就可以囉~~
範例一:刪除15天前的LOG資料夾。資料夾以日期(YYYYMMDD)格式命名,裡面放置了job1.log、jog2.log。
<echo message="try to delete one directory of 15 days ago: ${log.dir}/${deleteDay}"/>
<delete dir="${log.dir}/${deleteDay}"/>
範例二: 刪除前1個月的log資料夾裡的*.log,因為資料夾裡的檔案不只1個,我們使用了delete - fileset 的語法。
<echo message="try to delete files in directores which are 1 month ago: ${log.dir}/${deleteLastMonth}"/>
<delete>
<fileset dir="${log.dir}" includes="${deleteLastMonth}**/*.log"/>
</delete>
完成範例二之後,我們便能刪除範例二的這些檔案的資料夾;例如我們刪除了在 \log\20090912 裡的 job1.log、jog2.log之後才能成功的刪除 \log\20090912資料夾,當資料夾裡還有檔案時是無法直接刪除資料夾以及其內含的檔案滴!目前小妹我還沒有試出直接的使用語法,希望有高人未來能指點我囉。至少範例二 + 範例三,2個前後執行之後可以達到我們的目標,哈!
範例三:刪除前1個月的log資料夾, 例如現在是2009年10月13日, 則刪除資料夾名稱為: /log/20090901 至 /log/20090930的資料夾。
<echo message="try to delete empty directores which are 1 month ago under /log : ${log.dir}/${deleteLastMonth}"/>
<delete includeEmptydirs="true">
<fileset dir="${log.dir}" includes="**/${deleteLastMonth}**"/>
</delete>
用 標起來的**是小妹我看著ANT的官方文件想了很久試出來的,如果我們用DOS command:del ../log/200909* 的概念是無法完成刪除 /log/2009九月份命名的資料夾的想法滴,一定要加上前後標示的這二組**才OK唷~~當 範例二 & 範例三 一起執行完畢之後,c:\a-root\log\20090912、c:\a-root\log\20090927 與其它們的檔案就都會被刪除囉~~
範例四:刪除多個上個月的檔案,例如要刪除c:\a-root\data\ 的所有Tw0909*.zip。我們一樣用<format> + offset + unit計算出上個月是2009年9月份。
<format property="lastMonth" pattern="yyMM" locale="tw" offset="-1" unit="month" />;而fileHeader可以是我們先定好的常數,例如這個例子要刪掉以Tw為開頭的檔名則可以定義<property name="fileHeader" value="Tw"/>。
<echo message="try to delete: ${data.dir}/${fileHeader}${lastMonth}*.zip"/>
<delete includeEmptydirs="true">
<fileset dir="${data.dir}" includes="${fileHeader}${lastMonth}*.zip"/>
</delete>
以上就是今天的ANT實戰心得,報告完畢。
