ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:LesMills2 一定期間ごとにフォルダを自動削除したい。
困り度:
  • 暇なときにでも
○概要

バックアップソフトで特定フォルダを、毎時00:00に別ドライブにバックアップを取っておりますが、この時に自動生成されるバックアップフォルダ(フォルダとファイルが自動生成されます)を一定期間経過後自動削除したいのですが、ぴったり目的に合うフリーウェアが見つかりません。


○要望

デスクトップPCのMyDocumentフォルダを、外付けHD購入して増設し、付属ソフトでバックアップを取っております。

バックアップソフトは付属のものなので、簡易機能であり
営業日単位でバックアップジョブを登録してます。

ジョブ(1):月曜日のバックアップ(火曜日の00:00にMydocumentを自動バックアップ)
ジョブ(2):火曜日のバックアップ(水曜日の00:00にMydocumentを自動バックアップ)
ジョブ(3):水曜日のバックアップ(木曜日の00:00にMydocumentを自動バックアップ)
ジョブ(4):木曜日のバックアップ(金曜日の00:00にMydocumentを自動バックアップ)
ジョブ(5):金曜日のバックアップ(土曜日の00:00にMydocumentを自動バックアップ)

バックアップ先は増設した外付けHD(Eドライブ)配下の曜日フォルダです。

E:\Backup\Monday\
E:\Backup\Tuesday\
E:\Backup\Wednesday\
E:\Backup\Thrusday\
E:\Backup\Friday\

各ジョブに対応したフォルダ名はシステムで一意に決められ変更はできません。
また、ジョブごとに1フォルダずつできるのもバックアップソフトの仕様です。
各ジョブに対応した曜日ごとのフォルダ配下に、00:00にMydoumentを自動バックアップすると
乱数フォルダ名のフォルダが自動生成され、その中にバックアップソフト独自の1かたまりになったファイルが1つと設定ファイルが1つできます。

この、各ジョブに対応した曜日フォルダ配下に自動生成されるバックアップフォルダを一定期間ごとに自動削除したいというのが要望です。


期間は1ヶ月(20営業日)で削除したいので、1ヶ月たったフォルダを自動削除でも
E:\Backupフォルダを監視し、フォルダ数が20個以上いったら、古いものから自動削除という設定でも
各曜日フォルダ配下のフォルダが4個以上いったら古いものから自動削除でも構いません。

まずフォルダの自動削除ソフトウェアが数が少なく、ファイル対応のものばかりです。
あっても、監視フォルダ数が少なかったり、孫フォルダ非対応のものしか見つかりません。

よい方法があったらお教え願います。
質問投稿日時:08/05/12 18:07
質問番号:4017047
最新から表示回答順に表示

回答

 

回答者:iriyak > 確かにyyyymmddhhmmss のように見えますよね。

はい。こちらはまだ(あてにしてよい)仕様かどうかは分かりませんから、孫フォルダの最終更新日付を比較の対象にして、削除するためのバッチプログラムを自動作成する Windows Script Host (VBScript, JScript) のプログラム例をご紹介します。

■listup.wsf

<package>
<job>
<script language='VBScript'>
Function MonthsAgo(n)
MonthsAgo = FormatDateTime(DateAdd("m", - n, Now))
End Function

Function DaysAgo(n)
DaysAgo = FormatDateTime(DateAdd("d", - n, Now))
End Function

Function HoursAgo(n)
HoursAgo = FormatDateTime(DateAdd("h", - n, Now))
End Function
</script>
<script language='JavaScript'>
Enumerator.prototype.asArray = function () {
  var anArray = [];
  for (; !this.atEnd(); this.moveNext())
    anArray.push(this.item());
  return anArray;
}

Array.prototype.do_ = function (operation) {
  for (var i = 0; i < this.length; i++)
    operation(this[i]);
}

Array.prototype.select_ = function (discriminator) {
  var anArray = [];
  this.do_(function (each) { if (discriminator(each)) anArray.push(each) });
  return anArray;
}

function listup_files(filepath, discriminator) {
  discriminator = discriminator || function (each) { return true }
  var FileSystemObject = new ActiveXObject('Scripting.FileSystemObject');
  var rootFolder = FileSystemObject.getFolder(filepath);
  var subFolders = new Enumerator(rootFolder.subFolders).asArray();
  subFolders.do_(function (subFolder) {
    WScript.echo('REM ' + subFolder);
    var subsubFolders = new Enumerator(subFolder.subFolders).asArray();
    subsubFolders.select_(discriminator).do_(function (subsubFolder) {
      WScript.echo('RMDIR /Q /S ' + subsubFolder);
    });
    WScript.echo('');
  });
  WScript.echo('PAUSE');
}
</script>
<script language='JavaScript'>
var targetpath = 'E:\\EasySaverBackup'; // ★1
var discriminator1 = function (folder) { return folder.DateLastModified < new Date(MonthsAgo(1)) }
var discriminator2 = function (folder) { return folder.DateLastModified < new Date(DaysAgo(1)) }
var discriminator3 = function (folder) { return folder.DateLastModified < new Date(HoursAgo(1)) }
listup_files(targetpath, discriminator1); // ★2
</script>
</job>
</package>

■listup.wsf の編集

★1: 親、子、孫フォルダの親フォルダを指定します
★2: discriminator1, 2, 3 は、実行する時刻から、それぞれ 1か月前、1日前、1時間前の孫フォルダを抽出するよう指示するためのプログラムで、listup_files() の第二引数に与えてやります。

■実行方法

(3)は画面に出力し、(4)は rmdir.bat バッチファイルに出力をリダイレクトします。(5)で実際に削除を指示します。

(1) listup.wsf を E:\ に格納します
(2) コマンドプロンプトを開き CD E:\ に移動します
(3) cscript.exe //nologo listup.wsf
(4) cscript.exe //nologo listup.wsf > rmdir.bat
(5) rmdir.bat

■(3)の実行例

・削除対象がない場合

E:\>type rmdir.bat
REM E:\EasySaverBackup\2007071210480309193a97
RMDIR /Q /S E:\EasySaverBackup\2007071210480309193a97\20080422000540
RMDIR /Q /S E:\EasySaverBackup\2007071210480309193a97\20080429000748
RMDIR /Q /S E:\EasySaverBackup\2007071210480309193a97\20080506110544
RMDIR /Q /S E:\EasySaverBackup\2007071210480309193a97\20080513000344

REM E:\EasySaverBackup\20070712105211091d0173
RMDIR /Q /S E:\EasySaverBackup\20070712105211091d0173\20080416000319
RMDIR /Q /S E:\EasySaverBackup\20070712105211091d0173\20080423000228
RMDIR /Q /S E:\EasySaverBackup\20070712105211091d0173\20080430000800
RMDIR /Q /S E:\EasySaverBackup\20070712105211091d0173\20080507085010

REM E:\EasySaverBackup\20070712105354091e963c
RMDIR /Q /S E:\EasySaverBackup\20070712105354091e963c\20080417001456
RMDIR /Q /S E:\EasySaverBackup\20070712105354091e963c\20080424000837
RMDIR /Q /S E:\EasySaverBackup\20070712105354091e963c\20080501002234
RMDIR /Q /S E:\EasySaverBackup\20070712105354091e963c\20080508000339

REM E:\EasySaverBackup\20070712105419091ef4f6
RMDIR /Q /S E:\EasySaverBackup\20070712105419091ef4f6\20080418000230
RMDIR /Q /S E:\EasySaverBackup\20070712105419091ef4f6\20080425000132
RMDIR /Q /S E:\EasySaverBackup\20070712105419091ef4f6\20080502000801
RMDIR /Q /S E:\EasySaverBackup\20070712105419091ef4f6\20080509000226

REM E:\EasySaverBackup\20070712105457091f8c83
RMDIR /Q /S E:\EasySaverBackup\20070712105457091f8c83\20080419000341
RMDIR /Q /S E:\EasySaverBackup\20070712105457091f8c83\20080426000234
RMDIR /Q /S E:\EasySaverBackup\20070712105457091f8c83\20080506111003
RMDIR /Q /S E:\EasySaverBackup\20070712105457091f8c83\20080510000353

PAUSE

E:\>

・削除対象がある場合

E:\>type rmdir.bat
REM E:\EasySaverBackup\2007071210480309193a97

REM E:\EasySaverBackup\20070712105211091d0173

REM E:\EasySaverBackup\20070712105354091e963c

REM E:\EasySaverBackup\20070712105419091ef4f6

REM E:\EasySaverBackup\20070712105457091f8c83

PAUSE

E:\>

■さらなる改善ポイント

・バッチプログラムの実行も指示する
・タスクとして登録して定期的に実行を指示する
・★2 で指示する discriminator をチューニングする
・その他のプログラミング言語の移植にトライする
種類:回答
どんな人:経験者
自信:自信あり
回答日時:08/05/18 03:48
回答番号:No.5
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:iriyak こんにちは。

出来あいのソフトウェアをお探しのようですが、そういう削除を行うプログラムを自作することは選択肢に入れてもよいのでしょうか。

孫フォルダの名前にバックアップを着手した時刻らしきものが記録されているように見えます。そこに注目するとプログラム可能では?? と回答者は感じました。
種類:補足要求
どんな人:経験者
自信:自信あり
回答日時:08/05/17 01:23
回答番号:No.4
この回答への補足>出来あいのソフトウェアをお探しのようですが、そういう削除を行うプログラムを自作することは選択肢に入れてもよいのでしょうか。

OKです。vbsかbatファイル程度であれば、着手は可能だと思います。

>孫フォルダの名前にバックアップを着手した時刻らしきものが記録されているように見えます。そこに注目するとプログラム可能では?? と回答者は感じました。

ヒントありがとうございます。

確かにyyyymmddhhmmss
のように見えますよね。
ソフトの仕様にはそこまで触れられていなかったので
こちらについては詳しく検証して調べていく必要がありそうです。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:noname#70614 一定期間ごとに指定したフォルダの中身だけを自動削除
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:08/05/13 08:41
回答番号:No.3
参考URL: http://nagabuchi.jugem.jp/?eid=97
この回答への補足具体的にディレクトリのツリー表示を載せるとこんな感じです。

f:
├─ EasySaverBackup <Folder>
  ├─ 2007071210480309193a97 <Folder>
  │ ├─ 20080422000540 <Folder>
  │ ├─ 20080429000748 <Folder>
  │ ├─ 20080506110544 <Folder>
  │ └─ 20080513000344 <Folder>
  ├─ 20070712105211091d0173 <Folder>
  │ ├─ 20080416000319 <Folder>
  │ ├─ 20080423000228 <Folder>
  │ ├─ 20080430000800 <Folder>
  │ └─ 20080507085010 <Folder>
  ├─ 20070712105354091e963c <Folder>
  │ ├─ 20080417001456 <Folder>
  │ ├─ 20080424000837 <Folder>
  │ ├─ 20080501002234 <Folder>
  │ └─ 20080508000339 <Folder>
  ├─ 20070712105419091ef4f6 <Folder>
  │ ├─ 20080418000230 <Folder>
  │ ├─ 20080425000132 <Folder>
  │ ├─ 20080502000801 <Folder>
  │ └─ 20080509000226 <Folder>
  └─ 20070712105457091f8c83 <Folder>
  ├─ 20080419000341 <Folder>
  ├─ 20080426000234 <Folder>
  ├─ 20080506111003 <Folder>
  └─ 20080510000353 <Folder>

EasySaverBackup配下に出来ている5つのフォルダがそれぞれ
月〜金のジョブ用のフォルダです。
その配下に毎時00:00にバックアップフォルダと、その中にバックアップファイルが作成されるので、ディスク容量を圧迫しないように、1ヶ月前のフォルダを消していきたいのです。

1ヶ月前というのはおおよそなんで、本日5/13であれば、4/13までのフォルダを消していく具合です。
今は手動でやっています。

ちなみに一つのジョブフォルダ配下のバックアップフォルダの中には以下のようなファイルが生成されます。

└─ 20080510000353 <Folder>
├─ 00000001.bkd.....2097109KB.....2008/05/10 0:10:12
├─ 00000002.bkd.....2097113KB.....2008/05/10 0:12:20
├─ 00000003.bkd.....2097102KB.....2008/05/10 0:14:58
├─ 00000004.bkd.....2097108KB.....2008/05/10 0:18:44
├─ 00000005.bkd.....1520101KB.....2008/05/10 0:20:46
├─ database.edb.....8680KB.....2008/05/10 0:20:48
└─ database.txt........1KB.....2008/05/10 0:20:46
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:noname#70614 タスクスケジューラというのは知っていますか?

タスクスケジューラを使えば可能です。
種類:補足要求
どんな人:専門家
自信:参考意見
回答日時:08/05/12 23:21
回答番号:No.2
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:foitec >乱数フォルダ名のフォルダが自動生成され

自動的に消去するユーティリティがあったとして、バックアップソフトウエアが生成した乱数に基づくフォルダ名は判別できるでしょうか?
ワイルドカードなどの条件を指定すれば可能かもしれません。

とこおで、OSのNTバックアップを利用(ボリュームシャドーコピーが利用される)で
スケジュール管理し週単位で「月・火・水・木・金)を指定し
上書き指定すれば常に最新のものだけがバックアップされます。
つまり同じ曜日の古いバックアップは上書きにより消されます。

欠点
ボリュームシャドーコピーを利用するので元のボリュームが壊れると復元できない。
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:08/05/12 18:34
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼>自動的に消去するユーティリティがあったとして、バックアップソフトウエアが生成した乱数に基づくフォルダ名は判別できるでしょうか?

この質問を上げる前まで検討していたソフトがあります。
http://www.vector.co.jp/soft/win95/util/se220077.html

これだと、指定フォルダ内に指定したフォルダ数以上のフォルダができると、古いものから削除できます。

今回の場合、孫フォルダまで監視する必要がある・もしくは、5フォルダを監視する必要があるので、検討から外れましたが。。

>ボリュームシャドーコピー

バックアップしてるPCはメインドライブをハードウェアRAIDをかけております。
ソフトウェアでかけてるバックアップは、オペレーションミスによる誤消去ファイルを復活させるため、1ヶ月前の分までバックアップを保存しておく事なので、確かに差分バックアップでも構わないのですが、バックアップ用に300GBの外付けHDを準備してあるので、フルバックアップを選択しました。
最新から表示回答順に表示