[前の記事]« ATコマンドを利用して別のマシンにファイルをコピーしたい
[次の記事]WinNT4/2000:入力された日付のチェックがうまくいきません »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「DATE,TIME…日付、時刻の取得/利用」索引へ
▲カテゴリー「FOR /F」索引へ

[全般]日付を名前につけたフォルダから古いものだけを削除するには


496) 日付のフォルダを削除する のべんとう 2003/08/03(日) 19:40


こんにちは。初心者です。日付のフォルダについて
教えてください。どうぞ宜しくお願いします。

日付のフォルダを削除したいと思います。
今日から7日前より古いフォルダは削除したいのですが
どのようにしていいかわかりません。
フォルダは常に「20030702」のようなyyyymmddの形式の
名前になっています。
毎日バックアップをとっているので、古いものから
順番に削除して、今日を含めて7日分だけノコって
いればいいという考えなんです。

どうか、ご教授願いします。宜しくお願いします。


500) Re:日付のフォルダを削除する Hellcat 2003/08/03(日) 22:26


>日付のフォルダを削除したいと思います。
>今日から7日前より古いフォルダは削除したいのですが
>どのようにしていいかわかりません。
>フォルダは常に「20030702」のようなyyyymmddの形式の
>名前になっています。

OSが不明ですが、それと御質問の趣旨とはちょっと違うかも知れませんが…

○日前に作成されたファイルやディレクトリーを削除する方法として、次のようなツールがあります。これは、ファイル等の作成日付を参照します。
よって、ディレクトリー名称を基準として削除しようとしている「のべんとう」さんの御質問の趣旨からは外れますが(^^; 参考ということで……

FIND.EXE(find314.lzhに含まれている)とRM.EXE(RM202.LZHに含まれている)いうフリーソフトを使います。
FIND.EXEという名称はDOSのFINDコマンドと名称が重複するので、ここではXFIND.EXEとリネームすることとします。

【使い方】
XFIND D:\WORK -ty d -time +6 -exec RM -r {} ;

今日が8月3日として7日前を7月27日とする場合、上記のように指定するとDドライブの\WORKディレクトリー及びサブディレクトリーから2003年7月27日及びそれよりも前の作成日付を有するディレクトリーを探しだし、それらを一括して削除します。
ディレクトリーが空でなくても、いきなり(確認メッセージを出力することなく)削除します。

 "-ty d"は「ディレクトリーのみを探し出す」という意味のスイッチ
 "-time +6"は「今日よりも7日前及びそれ以前の作成日付を有するもの」という意味
 "-exec RM -r {} ;"は「該当したディレクトリー及びサブディレクトリーをRMコマンドで削除」という意味


7日前の日付のディレクトリーのみを削除したい場合は
 -ty d -time 6
とします。

【注意】
FIND.EXE(find314.lzh)は多機能です。詳細はマニュアルをご覧下さい。
また、RM.EXE(RM202.LZH)は強力な削除ツールです。利用する場合はマニュアルをよく読み、充分テストしてからお使い下さい。
これらはMS-DOSのツールですがWinXPなどでも動くと思います。いずれにしても慎重にテストしてください。

【所在】
FINDコマンド(find314.lzh)
http://rd.vector.co.jp/soft/dl/dos/util/se005115.html

RMコマンド(rm202.lzh)
http://rd.vector.co.jp/soft/dl/dos/util/se004592.html

this article refers Vector Soft Library..

546) Re2:日付のフォルダを削除する のべんとう 2003/08/15(金) 09:33


Hellcat さんありがとうございます。
今後参考になりそうですので、参考にしたいと思います
ありがとうございました。

502) Re:日付のフォルダを削除する ふぇむ 2003/08/04(月) 13:16


>日付のフォルダを削除したいと思います。
>今日から7日前より古いフォルダは削除したいのですが
>どのようにしていいかわかりません。
>フォルダは常に「20030702」のようなyyyymmddの形式の
>名前になっています。
>毎日バックアップをとっているので、古いものから
>順番に削除して、今日を含めて7日分だけノコって
>いればいいという考えなんです。

いわゆる世代管理をしたいということですね。
Windows2000以降のOSなら、DOSコマンドだけでも組めます。
私は、デイリーのバックアップファイルをDOSコマンドだけで世代管理しています。

YYYYMMDD形式のフォルダ単位の世代管理で、単純に7世代ということなら、方針は以下のとおりでいいのではないでしょうか。

・for 文にて SKIP=7 を指定し、in ( ) の中では dir コマンドを使って、現在存在する世代管理対象のディレクトリだけの降順リストを得る。
・do ( ) ブロックから、対象のディレクトリを引数にして、引数で指定されたディレクトリを丸ごと削除するサブルーチンをコールする。
・サブルーチン側では、引数で与えられたディレクトリの存在を確認し、すべて消す。

単純に7世代とかではなく、当日の日付とからめてさらに条件をつけたいならば、上のような単純な SKIP ではなくて、

・dir コマンドで現在存在する世代管理対象のディレクトリだけの降順リストを得る。
・for 文を使って、リストの各候補に対して消すべきか消さないべきかの判定を行い、消すべきリストを作る。
・for 文を使って、その消すべきリスト全部に対してそれぞれ丸ごと削除するサブルーチンをコールする。
・サブルーチン側では、引数で与えられたディレクトリの存在を確認し、すべて消す。

とか、いろいろ拡張は可能だと思います。



547) Re2:日付のフォルダを削除する のべんとう 2003/08/15(金) 09:37



>YYYYMMDD形式のフォルダ単位の世代管理で、単純に7世代ということなら、方針は以下のとおりでいいのではないでしょうか。

>・for 文にて SKIP=7 を指定し、

→SKIPとはなんですか?ごめんなさい初心者でまったく
わかりません。教えてください。
また、FOR文で変数の中にDIRの降順のリスト
を作ったから、リストひとつひとつを比較する方法がわかりません。

というより、かなり他もわからない部分が多くこまっています。
何か例のようなものとかあれば、教えていただきたいと思うのですが、
いかがでしょうか。

ヘルプで調べてFOR文まではなんとかなりました。

どうぞご教授お願い致します。






549) Re2:日付のフォルダを削除する のべんとう 2003/08/16(土) 06:15


ふえむさん今日1日かけてやったらできました。
ありがとうございました。
プログラミングのくせがついてまして考え方が
全くわからなかったのでよくわからず悪銭苦闘しました。


592) Re2:日付のフォルダを削除する こころ 2003/09/08(月) 14:46


はじめまして、こころです。
私も同じくフォルダを世代で管理したいと思い、バッチファイルを作成しているのですが、うまく行っていません。
どなたか具体的にバッチの内容を教えてくれませんでしょうか。本日の日付より31日前のフォルダを削除するようにしたいと思っています。
初めてなもので何をやったらいいのか、分からないので申し訳ございませんが、ご教示下さい。

>>日付のフォルダを削除したいと思います。
>>今日から7日前より古いフォルダは削除したいのですが
>>どのようにしていいかわかりません。
>>フォルダは常に「20030702」のようなyyyymmddの形式の
>>名前になっています。
>>毎日バックアップをとっているので、古いものから
>>順番に削除して、今日を含めて7日分だけノコって
>>いればいいという考えなんです。

>いわゆる世代管理をしたいということですね。
>Windows2000以降のOSなら、DOSコマンドだけでも組めます。
>私は、デイリーのバックアップファイルをDOSコマンドだけで世代管理しています。

>YYYYMMDD形式のフォルダ単位の世代管理で、単純に7世代ということなら、方針は以下のとおりでいいのではないでしょうか。

>・for 文にて SKIP=7 を指定し、in ( ) の中では dir コマンドを使って、現在存在する世代管理対象のディレクトリだけの降順リストを得る。
>・do ( ) ブロックから、対象のディレクトリを引数にして、引数で指定されたディレクトリを丸ごと削除するサブルーチンをコールする。
>・サブルーチン側では、引数で与えられたディレクトリの存在を確認し、すべて消す。

>単純に7世代とかではなく、当日の日付とからめてさらに条件をつけたいならば、上のような単純な SKIP ではなくて、

>・dir コマンドで現在存在する世代管理対象のディレクトリだけの降順リストを得る。
>・for 文を使って、リストの各候補に対して消すべきか消さないべきかの判定を行い、消すべきリストを作る。
>・for 文を使って、その消すべきリスト全部に対してそれぞれ丸ごと削除するサブルーチンをコールする。
>・サブルーチン側では、引数で与えられたディレクトリの存在を確認し、すべて消す。

>とか、いろいろ拡張は可能だと思います。





594) Re3:日付のフォルダを削除する ふぇむ 2003/09/09(火) 10:51


>はじめまして、こころです。
>私も同じくフォルダを世代で管理したいと思い、バッチファイルを作成しているのですが、うまく行っていません。
>どなたか具体的にバッチの内容を教えてくれませんでしょうか。

それは「動くバッチスクリプトを作ってください」とおっしゃっています?(^^;

一応骨組みですが、我流ですが私なら以下のような感じで書くと思います。

@echo off

スクリプト起動に関わる処理

初期処理~環境設定・初期設定など

起動ログ取得

バックアップフォルダのリスト取得

for文でリストをループ (
call :リストの1件が削除対象かどうかチェックして
削除対象なら消す機能の呼び出し 引数に必要な情報群
)

終了処理

終了ログ取得

goto :end


:引数が削除対象かどうかチェックして削除対象なら消す

引数に基づき、削除対象かどうか判定

削除対象であった場合は削除処理

引数と実行結果のログ取得

goto :eof


:その他必要なサブルーチン群

..........

goto :eof


:end

スクリプト終了に関わる処理



595) Re4:日付のフォルダを削除する ふぇむ 2003/09/09(火) 10:53


もうすこし内容について触れます。以下、例えば、ですが。

"本日より31日前の年月日" を算出するスクリプト(サブルーチン)が必要ですが(これはこれで一つのテーマですね)、そこはちょっとおいておいて、その文字列が既に %DATE_LIMIT% に入っているとします。

また、たとえば %BACKUP_FOLDER% にはバックアップのルートフォルダフルパスが指定してある(\で終わっていない)として、その下に、

20030801
20030802
20030803
.......

というような定形式でバックアップ日付ごとに作成されたバックアップフォルダがあるとします。

次のようにして、現在存在するバックアップフォルダのリストが入手できます。なお、%FOLDER_LIST% にはこのフォルダリストを格納するべきテキストファイル名フルパスが指定されているとします。

dir "%BACKUP_FOLDER%" /a:d /b > "%FOLDER_LIST%"

このリストに基づき、for文を使って

for /F "usebackq tokens=*" %%z in ( "%BACKUP_FOLDER%" ) do (
call :CHECK_AND_DELETE %%z %DATE_LIMIT% "%BACKUP_FOLDER%\%%z"
)

みたいな感じでループさせます。

飛び先の :CHECK_AND_DELETE サブルーチンは、例えば

:CHECK_AND_DELETE
set __TARGET_STR=%1
set __LIMIT_STR=%2
set __TARGET_FOLDER=%~3

if %__TARGET_STR% LSS %__LIMIT_STR% (
call :FOLDER_DELETE "%__TARGET_FOLDER%"
)
echo
goto :eof

みたいな感じにしておき、飛び先の :FOLDER_DELETE の中で実際のフォルダ削除を行なう、みたいな感じでいけると思います。あとは適当(適切)にログをとることでしょうか。
(私の個人的趣味で、極力呼び元側に情報を書いて呼び出される側はパッシブにしたいのでこんな形に書いています)

とりあえずここまで。


777) Re2:日付のフォルダを削除する とくてん 2003/11/04(火) 22:03


あの割り込んですみません。僕も同じようなことをなんとか
バッチのみで行おうと思うのですがうまくいきません。
環境はWindowsNT4.0Serverで7日前のファイルを削除しよう
とバッチを作りかけていたのですが・・・

なにかいい方法がありましたらご教授願います
↓作りかけバッチ

for /F "tokens=1-3 delims=/ " %%a in ('date /t') do set NowDate=%%a%%b%%c

rem ## 年月日の分割処理
set yy=%NowDate:~2,2%
set mm=%NowDate:~4,2%
set dd=%NowDate:~6,2%

rem ## 月日の数値化処理(8進数対策)
set /a mm=1%mm%-100
set /a dd=1%dd%-100

rem ## 何日前か?
set /a dd=dd-7

if %dd% GEQ 0 goto end

rem ## 月跨処理
set /a mm=mm-1

rem ## 西向く侍処理
set w=0030101001010

set w=%w:~%mm%,1% ←ここがうまくいかなーい

set /a dd=dd+31-w

rem ## 閏年処理
set /a u=yy %%4
if %u% NEQ 0 goto end

echo u=%u%

rem ## 2月処理
if %mm% EQU 2 set /a dd=dd+1

:end

rem ## 月日の数値化処理(戻し)
set mm=0%mm%
set mm=%mm:~1,2%
set dd=0%dd%
set dd=%dd:~1,2%

set PastDate=%yy%%mm%%dd%

echo %PastDate%


778) Re3:日付のフォルダを削除する ふぇむ 2003/11/05(水) 03:33


>環境はWindowsNT4.0Serverで7日前のファイルを削除しよう
>とバッチを作りかけていたのですが・・・

>set w=%w:~%mm%,1% ←ここがうまくいかなーい

間接参照したいということですか?
NT4.0はもう忘れてしまったし手元にも環境が無いので、NT4.0で動作するかどうかわかりませんが、たとえばこんな感じでどうでしょう。ひとつのサンプルです。主旨はわかると思いますが...


@echo off

  set w=0030101001010

  for /L %%i in (0,1,12) do call :PICKUP %%i

  goto :end


:PICKUP
  set PTR=%1
  set CMD=%%w:~%PTR%,1%%

  call :EXPAND ANS %CMD%
  echo %PTR% --- %ANS%
  goto :eof


:EXPAND
  set %1=%2
  goto :eof


:end


他にも逃げ道はあると思います。格好よくはないけれど確実なのは、たかだか12個を分岐すればいいわけなので、gotoと変数ラベルを利用する形式でしょう。



>rem ## 閏年処理
>set /a u=yy %%4

閏年のルールに完全に沿っていないので、一応「簡易」とかコメントを入れておいたほうがいいと思いますよ。



783) Re3:日付のフォルダを削除する じゃく 2003/11/05(水) 15:47

http://homepage1.nifty.com/jak/batch/date.html

とくてんさん、こんにちは。

>環境はWindowsNT4.0Serverで7日前のファイルを削除しよう
>とバッチを作りかけていたのですが・・・

>なにかいい方法がありましたらご教授願います
>↓作りかけバッチ

>for /F "tokens=1-3 delims=/ " %%a in ('date /t') do set NowDate=%%a%%b%%c

>rem ## 年月日の分割処理
>set yy=%NowDate:~2,2%
>set mm=%NowDate:~4,2%
>set dd=%NowDate:~6,2%

>rem ## 月日の数値化処理(8進数対策)
>set /a mm=1%mm%-100
>set /a dd=1%dd%-100

>rem ## 何日前か?
>set /a dd=dd-7

>if %dd% GEQ 0 goto end

>rem ## 月跨処理
>set /a mm=mm-1

>rem ## 西向く侍処理
>set w=0030101001010

>set w=%w:~%mm%,1% ←ここがうまくいかなーい

>set /a dd=dd+31-w

>rem ## 閏年処理
>set /a u=yy %%4
>if %u% NEQ 0 goto end

>echo u=%u%

>rem ## 2月処理
>if %mm% EQU 2 set /a dd=dd+1

>:end

>rem ## 月日の数値化処理(戻し)
>set mm=0%mm%
>set mm=%mm:~1,2%
>set dd=0%dd%
>set dd=%dd:~1,2%

>set PastDate=%yy%%mm%%dd%

>echo %PastDate%




見たことあるな、このソース(笑)

当方のページ(http://homepage1.nifty.com/jak/batch/date.html)を参考にされましたか?(ちがうかな?)

このページでは、うまく動かないとおっしゃってる、
>rem ## 西向く侍処理
>set w=0030101001010
>set w=%w:~%mm%,1% ←ここがうまくいかなーい
>set /a dd=dd+31-w

の部分を以下のように一旦別のバッチとしてecho文で出力しています。
------------------(リンク先より抜粋)-----------
echo set sub=0030101001010 >sub.bat
echo set /a dd=31-%%sub:~%mm%,1%% >>sub.bat
call sub.bat
---------------------------(抜粋終わり)------
なぜこうするかというと、環境変数の部分参照と環境変数mmの
参照が入れ子状態になっており、そのままでは同時に扱えない
からです。
(set w=%w:~%mm%,1% の %w:~月数,1% という部分参照と 月数mmを数値として環境変数から取り出す部分)

したがって、別のバッチに書き込む段階でで一旦月数を数値化する部分だけが実行され、バッチを実行するときに部分参照が実行されるようにしています。

もしくは、ふぇむさんが回答されているように、call :ラベル の
引数で渡すことで同様に2段階の実行を実現するしかないです。

それから、以下の行
>if %dd% GEQ 0 goto end
は比較演算子が dd >=0 となっており、毎月7日に実行すると
正しい結果となりません。
if %dd% GTR 0 goto end
ですね。

当方のページには、別の方法で7日前でも1000日前でも求めることが
できるバッチを紹介していますので、よかったら参考にしてください。




785) Re4:日付のフォルダを削除する じゃく 2003/11/05(水) 16:09

http://homepage1.nifty.com/jak/batch/date.html

補足です。

>もしくは、ふぇむさんが回答されているように、call :ラベル の
>引数で渡すことで同様に2段階の実行を実現するしかないです。

しかないです。と断定していますが(笑)訂正します。
ふぇむさんは、これ以外にgoto 文による方法も提示されていました。確かにこれは確実です。

goto %mm%
:1
set /a dd=dd+31
goto L1
:2
set /a dd=dd+28
goto L1
:3
set /a dd=dd+31
goto L1
(以下12まで続く)
:12
set /a dd=dd+31
:L1
のようになりますね。




790) Re5:日付のフォルダを削除する とくてん 2003/11/05(水) 17:44


ふぇむさん、じゃくさん ありがとうございます!!
ふぇむさんのGOTOの12分岐を盛り込もうと思います!!
(バッチ初心者の僕にはfor文はちんぷんかんぷんで(^^;)
またじゃくさんごめんなさい!!まさにこれをパクりました!
ヤフーからWEBを彷徨いようやく見つめたページなのに
まさか作者がでてくるとは思いませんでした!!
無断で使ってごめんなさい!!ゴメンナサイ(;人;)
いま、Win4.0ServerとWin2000Serverで同じ目的の7日前バッチを
作ろうとしてるんですが、応用がきくように30日前のファイルを削除できるバッチも作りたいと思います。じゃくさんのジュリアンデート方法をいま研究しています。ふぇむさんじゃくさん本当にありがとうございました!

791) Re6:日付のフォルダを削除する じゃく 2003/11/05(水) 21:35

http://homepage1.nifty.com/jak/batch/date.html

とくてんさん、こんばんは。

>ふぇむさんのGOTOの12分岐を盛り込もうと思います!!
>(バッチ初心者の僕にはfor文はちんぷんかんぷんで(^^;)

いまになってこういう書き方も考えつきました。
set /a dd=dd+31
if "%mm%"=="2" set /a dd=dd-3
if "%mm%"=="4" set /a dd=dd-1
if "%mm%"=="6" set /a dd=dd-1
if "%mm%"=="9" set /a dd=dd-1
if "%mm%"=="11" set /a dd=dd-1

このほうが行数が少ないかな。(まさに西向く侍処理)

>またじゃくさんごめんなさい!!まさにこれをパクりました!
>ヤフーからWEBを彷徨いようやく見つめたページなのに
>まさか作者がでてくるとは思いませんでした!!
>無断で使ってごめんなさい!!ゴメンナサイ(;人;)

みなさんの参考にしてもらうために公開しているのでいいですよ。
うまくNT用にアレンジしてたじゃないですか。


>いま、Win4.0ServerとWin2000Serverで同じ目的の7日前バッチを
>作ろうとしてるんですが、応用がきくように30日前のファイルを削除できるバッチも作りたいと思います。じゃくさんのジュリアンデート方法をいま研究しています。ふぇむさんじゃくさん本当にありがとうございました!

お役に立てて何よりです。では。


814) Re7:日付のフォルダを削除する とくてん 2003/11/06(木) 18:57


途中まではうまくいったんだけど、最後がうまくいかないよー!
なんでだろーおしえてー(;Д;)

for /F "tokens=1-3 delims=/ " %%a in ('date /t') do set NowDate=%%a%%b%%c
rem ## 年月日の分割処理
set yy=%NowDate:~0,4%
set mm=%NowDate:~4,2%
set dd=%NowDate:~6,2%
echo NowDate
rem ## 月日の数値化処理(8進数対策)
set /a mm=1%mm%-100
set /a dd=1%dd%-100
rem ## 何日前か?
set /a dd=dd-7
if %dd% GEQ 1 goto end
rem ## 月跨処理
set /a mm=mm-1
rem ## 西向く侍処理
set /a dd=dd+31
if "%mm%"=="0" set mm=12&&set /a yy=yy-1
if "%mm%"=="2" set /a dd=dd-3
if "%mm%"=="4" set /a dd=dd-1
if "%mm%"=="6" set /a dd=dd-1
if "%mm%"=="9" set /a dd=dd-1
if "%mm%"=="11" set /a dd=dd-1
rem ## 簡易閏年処理
set /a u=yy %%4
if %u% NEQ 0 goto end
rem ## 2月処理
if %mm% EQU 2 set /a dd=dd+1

:end

rem ## 月日の数値化処理(戻し)
set mm=0%mm%
set mm=%mm:~-2% ←ここがうまくいかない(ノ_;)
set dd=0%dd%
set dd=%dd:~-2% ←ここがうまくいかない(ノ_;)
set PastDate=%yy:~2,2%%mm%%dd% ←年しか表示されない(ノ_;)
echo %PastDate%


818) Re8:日付のフォルダを削除する ふぇむ 2003/11/06(木) 19:15


>set mm=%mm:~-2% ←ここがうまくいかない(ノ_;)
>set dd=%dd:~-2% ←ここがうまくいかない(ノ_;)

NT4.0Server でしたっけ。%xx:~-n% の形式がサポートされてなかったりして。
念のため、そのマシン上で set /? と打ってみるとどうでしょうか。



819) Re9:日付のフォルダを削除する じゃく 2003/11/06(木) 21:30

http://homepage1.nifty.com/jak/batch/date.html

>>set mm=%mm:~-2% ←ここがうまくいかない(ノ_;)
>>set dd=%dd:~-2% ←ここがうまくいかない(ノ_;)

>NT4.0Server でしたっけ。%xx:~-n% の形式がサポートされてなかったりして。
>念のため、そのマシン上で set /? と打ってみるとどうでしょうか。

ふぇむさん、とくてんさんこんばんは。
手元のヘルプによると、ふぇむさんの指摘通りNTでは%xx:~-n% の形式はサポートされていません。
で、ここで何をしているかというと、月や日が1桁だったら0をつけるという処理なので、
>rem ## 月日の数値化処理(戻し)
>set mm=0%mm%
>set mm=%mm:~-2% ←ここがうまくいかない(ノ_;)
>set dd=0%dd%
>set dd=%dd:~-2% ←ここがうまくいかない(ノ_;)
は以下のように書き直せます。(これなら2行ですむな!)

rem ## 月日の数値化処理(戻し)
if %mm% LSS 10 set mm=0%mm%
if %dd% LSS 10 set dd=0%dd%




846) Re10:日付のフォルダを削除する とくてん 2003/11/11(火) 12:37


カーテンかけかえたらインターネットつながんなくなった(つд;)

どうやら光ケーブルの線がポキといったらしい

それはさておき、バッチありがとうございました!!
完成いたしましたー!!

また、お世話になるかも知れませんが、そのときはよろしくおねがいいたします。ではっ!
 
 


カテゴリー「DATE,TIME…日付、時刻の取得/利用」索引へ
カテゴリー「FOR /F」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2003年08月03日 02:15に投稿されたエントリーのページです。

ひとつ前の投稿は「ATコマンドを利用して別のマシンにファイルをコピーしたい」です。

次の投稿は「WinNT4/2000:入力された日付のチェックがうまくいきません」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート