[前の記事]« FOR文で全角文字を含む環境変数が削られてしまう
[次の記事]コマンドでファイルの所有者を変更できないか »

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

▲カテゴリー「DATE,TIME…日付、時刻の取得/利用」索引へ
▲カテゴリー「DEL,ERASE,REN…ファイル削除/復活/移動/名前の変更」索引へ

1週間更新されていないファイルの削除

147.
1週間更新されていないファイルの削除
2004年12月10日(金) 09時46分
トロワ・バートン
●DOS/Windowsのバージョン↓
 Windows2003
(以下ご自由に質問文をお書きください)

あるフォルダ配下にあるファイルもしくはフォルダが
1週間以上更新されていなかったら削除するという
スクリプトを作成したいと思っております。

unix系のシェルでは可能のようですが、
DOSコマンドだと検討もつきません。
DOSコマンド、VBS等でも構いませんし、
ロジックでも教えたいただければ思います。

宜しくお願い致します。
152.
Re:1週間更新されていないファイルの削除
2004年12月10日(金) 18時43分
otn
>●DOS/Windowsのバージョン↓
> Windows2003
>(以下ご自由に質問文をお書きください)

>あるフォルダ配下にあるファイルもしくはフォルダが
>1週間以上更新されていなかったら削除するという
>スクリプトを作成したいと思っております。

>unix系のシェルでは可能のようですが、
>DOSコマンドだと検討もつきません。
>DOSコマンド、VBS等でも構いませんし、
>ロジックでも教えたいただければ思います。

>宜しくお願い致します。

「WSH 古いファイル 削除」でGoogleするとこういうのが引っかかります。
http://www.kawabata.ksi.ne.jp/delold.asp

バッチでやるなら、日付けの計算だけVBSを使って、
@echo off
cd あるフォルダ
echo WScript.Echo DateAdd("d",-7,Now)> tmp.vbs
for /f "delims=" %%X in ('cscript //nologo tmp.vbs') do set OLD=%%X
del tmp.vbs
set OLD=%OLD:~0,16%
for %%F in (*) do if "%%~tF" lss "%OLD%" del "%%~F"

%%~tF で得られる更新日時の年が、Win2Kだと2桁、WinXPだと4桁です。Win2003は手元に無いので分かりませんが4桁だとして書いてあります。もし2桁なら set OLD=%OLD:~2,14% に修正してください。

また、子フォルダ内まで再帰的に探すなら、
for /r %%F in (*) do if "%%~tF" lss "%OLD%" del "%%~F"
と、/r を付ける。

>フォルダが1週間以上更新されていなかったら
フォルダのタイムスタンプが古かったら中に新しいファイルがあってもフォルダごと消しちゃうんでしょうか?もしそうなら、上記に追加して、
for /r /d %%F in (*) do if "%%~tF" lss "%OLD%" rd /s /q "%%~F"
追加は、ファイルを消す行の前につけないと駄目です(ファイルを消すとフォルダのタイムスタンプが変わる)。

そうではなくて、古いファイルを消した結果、空のフォルダが出来たら消すのなら、
for /r /d %%D in (*) do rd %%D 2>NUL
(空で無いフォルダをrdしても消えないことを利用) 
をファイルを消す行の後に追加。
153.
Re2:1週間更新されていないファイルの削除
2004年12月13日(月) 15時18分
トロワ・バートン
otn さん

ご返答有難うございます。
すごいスクリプトですね。
すみません、私の力不足のため内容を確認させて下さい。

>for %%F in (*) do if "%%~tF" lss "%OLD%" del "%%~F"
"%%~tF"ですが、これはfor文でループしている最中に出てくる
ファイルに対し、dir /tをしていることと同じでしょうか。
よしよろしければ詳しく教えてください。(特に~tについて)

>for /r /d %%D in (*) do rd %%D 2>NUL
%%D 2>NULですが、これは「ディレクトリでは
空ではありません」というエラーを無視する
ということでしょうか。このエラーが番号が2
でしょうか。
これも、よろしければ詳しく教えてください。(特に2>NULについて)


現在、このスクリプトを実行したいマシンが
他に使われているのでテスト出来ないのですが、
後日テストを行い、ご報告させていただきます。

宜しくお願いします。


>バッチでやるなら、日付けの計算だけVBSを使って、
>@echo off
>cd あるフォルダ
>echo WScript.Echo DateAdd("d",-7,Now)> tmp.vbs
>for /f "delims=" %%X in ('cscript //nologo tmp.vbs') do set OLD=%%X
>del tmp.vbs
>set OLD=%OLD:~0,16%
>for %%F in (*) do if "%%~tF" lss "%OLD%" del "%%~F"

>%%~tF で得られる更新日時の年が、Win2Kだと2桁、WinXPだと4桁です。Win2003は手元に無いので分かりませんが4桁だとして書いてあります。もし2桁なら set OLD=%OLD:~2,14% に修正してください。

>また、子フォルダ内まで再帰的に探すなら、
>for /r %%F in (*) do if "%%~tF" lss "%OLD%" del "%%~F"
>と、/r を付ける。

>>フォルダが1週間以上更新されていなかったら
>フォルダのタイムスタンプが古かったら中に新しいファイルがあってもフォルダごと消しちゃうんでしょうか?もしそうなら、上記に追加して、
>for /r /d %%F in (*) do if "%%~tF" lss "%OLD%" rd /s /q "%%~F"
>追加は、ファイルを消す行の前につけないと駄目です(ファイルを消すとフォルダのタイムスタンプが変わる)。

>そうではなくて、古いファイルを消した結果、空のフォルダが出来たら消すのなら、
>for /r /d %%D in (*) do rd %%D 2>NUL
>(空で無いフォルダをrdしても消えないことを利用) 
>をファイルを消す行の後に追加。
154.
Re3:1週間更新されていないファイルの削除
2004年12月13日(月) 17時33分
otn
otnです。

>otn さん

>ご返答有難うございます。
>すごいスクリプトですね。
>すみません、私の力不足のため内容を確認させて下さい。

>>for %%F in (*) do if "%%~tF" lss "%OLD%" del "%%~F"
>"%%~tF"ですが、これはfor文でループしている最中に出てくる
>ファイルに対し、dir /tをしていることと同じでしょうか。
>よしよろしければ詳しく教えてください。(特に~tについて)

コマンドプロンプトで、for /? してみてください。最後の方に説明があります。
手元のWindows機のコマンドプロンプトから、
for %A in (*) do @echo %~tA
などオプション文字を f z x 等変えながら実行してみてください。

>>for /r /d %%D in (*) do rd %%D 2>NUL
>%%D 2>NULですが、これは「ディレクトリでは
>空ではありません」というエラーを無視する
>ということでしょうか。このエラーが番号が2
>でしょうか。
>これも、よろしければ詳しく教えてください。(特に2>NULについて)

dir >abc.txt の意味はお分かりと思いますが、これは dir 1>abc.txt と書いても同じ事です。コマンドの出力は1番に出ます。1は > のデフォルト値です。
dir 存在しないファイル名 >abc.txt
すると、「ファイルが見つかりません」はabc.txtでなく画面に出ます。一般にエラーは2番に出ます。2番をファイルに入れたい時は、
dir 存在しない >abc.txt 2>abc2.txt
のようにします。どんなエラーでも2番です。
(何が主出力で何がエラー出力かはプログラムを設計する人が決めるわけですが)

ちなみに出力とエラー出力を1つにまとめてファイルに書きたい場合は、
dir xxxx >abc.txt 2>&1
のように書きます。2を1と一緒にするということですね。

このあたりはunix由来の機能です。この番号は、C言語をご存知ならopenで返されるファイルディスクリプタ番号のことです。

2>NUL は「エラーを無視」というより正確には「エラーメッセージを非表示にする」ということです。あくまで表示上の操作だけです。
・エラーを無視
・エラーメッセージを無視
そう違わないように見えますが、場合によっては大きく違います。
155.
Re3:1週間更新されていないファイルの削除
2004年12月13日(月) 17時43分
otn
書き漏れ。

>現在、このスクリプトを実行したいマシンが
>他に使われているのでテスト出来ないのですが、
>後日テストを行い、ご報告させていただきます。

最初の返事に書きましたが、Win2003Server上で、
for %F in (*) do @echo %~tF
してみて、年が4桁であるか確認を必ずしてください。

またまずはdelでなくechoにして、消すべきファイルの名前を確認するという動作確認も忘れずに。
161.
Re4:1週間更新されていないファイルの削除
2004年12月15日(水) 11時16分
トロワ・バートン
otn さん

ご丁寧な返答有難うございます。

スクリプト試させていただきました。

@echo off
cd c:\test\jjj
echo WScript.Echo DateAdd("d",-7,Now)> tmp.vbs
for /f "delims=" %%X in ('cscript //nologo tmp.vbs') do set OLD=%%X
del tmp.vbs
set OLD=%OLD:~0,16%
echo %OLD% > old.txt
for /r %%F in (*) do if "%%~tF" lss "%OLD%" del /F "%%~F"
for /r /d %%D in (*) do rd %%D 2>NUL
動きばっちりです。読み取り専用も削除したかったので、
del /Fにしました。

上記スクリプトとは別に以下を動かすと、空フォルダも完全に
消せました。どうも1つのスクリプトにするとファイル削除した際に
フォルダの更新時間が変更され、1週間前の時間を引き継いで
いるみたいです。
@echo off
for /r /d %%D in (*) do rd %%D 2>NUL

私のとっては、この上ないすばらしいスクリプトです。
有難うございました。
また何かありましたら宜しくお願いします。
162.
Re4:1週間更新されていないファイルの削除
2004年12月15日(水) 11時20分
トロワ・バートン
otn さん

ご丁寧な返答有難うございます。

スクリプト試させていただきました。

@echo off
cd c:\test\jjj
echo WScript.Echo DateAdd("d",-7,Now)> tmp.vbs
for /f "delims=" %%X in ('cscript //nologo tmp.vbs') do set OLD=%%X
del tmp.vbs
set OLD=%OLD:~0,16%
echo %OLD% > old.txt
for /r %%F in (*) do if "%%~tF" lss "%OLD%" del /F "%%~F"
for /r /d %%D in (*) do rd %%D 2>NUL
動きばっちりです。読み取り専用も削除したかったので、
del /Fにしました。

上記スクリプトとは別に以下を動かすと、空フォルダも完全に
消せました。どうも1つのスクリプトにするとファイル削除した際に
フォルダの更新時間が変更され、1週間前の時間を引き継いで
いるみたいです。
@echo off
for /r /d %%D in (*) do rd %%D 2>NUL

私のとっては、この上ないすばらしいスクリプトです。
有難うございました。
また何かありましたら宜しくお願いします。
 
 


カテゴリー「DATE,TIME…日付、時刻の取得/利用」索引へ
カテゴリー「DEL,ERASE,REN…ファイル削除/復活/移動/名前の変更」索引へ

 

カテゴリー一覧

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


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

資料書籍

About

2004年12月10日 08:52に投稿されたエントリーのページです。

ひとつ前の投稿は「FOR文で全角文字を含む環境変数が削られてしまう」です。

次の投稿は「コマンドでファイルの所有者を変更できないか」です。

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

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