bat

【bat】経過日数およびファイル数で古いファイルを削除する方法

今日は、batファイルの小技です。

ファイル管理は、ある程度日数が経過した、もしくはファイル数が多くなったら
勝手に消えてほしいファイルってありますよね。

例えば下記のケース

  • 日々のデータベースのバックアップ
  • 一定期間経過したログファイル

データベースを使用するシステムでは、
ほぼ100%バックアップを取るように言われますが、
永遠にバックアップを保存し続けることはまずありません。
どこかで古いファイルを消す必要がでてきます。

ファイルを削除する場合は、
下記のようなbatを作成して、タスクスケジューラーに登録しておくと便利です。


コードサンプル

下記は僕が私的に利用しているbatファイルの一部です。
僕の場合は、最後にデータベースのバックアップコマンドを呼んでいます。

引数を2つ用意していて、経過日数で管理したい場合は1つ目、
ファイル数で管理したい場合は2つ目の引数を入れて実行します。

 
rem ************************************************
rem ファイルの世代管理を行います。
rem 引数ありの場合、下記のトリガーに応じたファイルの削除を行います。
@echo 引数1:経過日数=(%~1)
@echo 引数2:ファイル数=(%~2)
rem ************************************************
@echo off

rem 対象フォルダパスを設定してください
cd /d {対象フォルダパス}
rem "sample_"から始まるファイルを対象とします
set fileName=sample_*

if not "%~1" == "" (
    @echo 引数1の日数が経過したファイルを削除します。※引数1の日数から削除
    forfiles /d -%1 /m %fileName% /c "cmd /c del @file"
)

if not "%~2" == "" (
    @echo 引数2の個数を超過した場合に古いファイルを削除します。
    for /f "skip=%~2" %%a in ('dir /b /o-d %fileName%') do del %%a
)

簡単に説明すると1つ目のif文内では、
引数1の入力があれば、%fileName%に合致する、本日より○日以前(/d -%1)のファイルが削除対象です。

2つ目のif文内では、
引数2の入力があれば、%fileName%に合致する、日付順に降順ソート(/o-d)して○個以降(skip=%~2″)のファイルが削除対象です。

どちらも見る日付フィールドは 最終更新日時 となります。
ただし、dirの引数には日付フィールドを指定するオプションが用意されています。
日付フィールドを指定したい場合は更に↓の引数を足します。

作成日時 最終アクセス日時 最終更新日時
/TC /TA /TW

おしまい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です