Windowsを使っていると、古いファイルを削除したくなる時があります。「FileHammer」などのフリーソフトを使うと簡単に出来ますが、いろいろ探したところ、Windowsの標準コマンドに用意されていました。
Windowsで日付を指定してファイルを削除する「forfiles」
そのコマンドは「forfiles」です。
このコマンド自体はファイル削除のコマンドではなく、特定の条件のファイルを検索するコマンドなのですが、組み合わせることで日付を指定してファイルを削除することが出来ます。
こちらはコマンドラインから使用するので、コマンドプロンプトを開きます。
Windowsキー+Rで「ファイル名を指定して実行」が開くのでそこに「cmd」と入力します。
コマンドプロンプトが開いたら「forfiles /?」でヘルプを見てみましょう。
[code]C:\Users>forfiles /?
FORFILES [/P パス名] [/M 検索マスク] [/S] [/C コマンド] [/D [+ | -] {yyyy/MM/dd | dd}]
説明:
ファイル (または、ファイルのセット) を選んで、そのファイル上のコマンドを実行します。これはバッチ ジョブの使用に便利です。
パラメーター一覧:
/P パス名 検索を開始するパスを示します。
既定のフォルダーは現在実行中のディレクトリ (.) です。
/M 検索マスク 検索マスクによってファイルを検索します。
既定の検索マスクは ‘*’ です。
/S サブディレクトリに対しても処理を行うように forfiles に指示します (例: “DIR /S”)。
/C コマンド 各ファイルの実行するコマンドを示します。
コマンドの文字列は二重引用符で囲んでください。
既定のコマンドは “cmd /c echo @file” です。
次の変数をコマンドの文字列に使用することができます:
@file – フィルの名前を返します。
@fname – 拡張子なしのファイル名を返します。
@ext – ファイルの拡張子だけを返します。
@path – ファイルの完全なパスを返します。
@relpath – ファイルの相対パスを返します。
@isdir – ファイルの種類がディレクトリの場合は “TRUE”を、ファイルの場合は”FALSE” を返します。
@fsize – ファイルのサイズをバイトで返します。
@fdate – ファイルの最終更新日を返します。
@ftime – ファイルの最終更新時刻を返します。
コマンド ラインに特殊文字を使用する場合は、文字を 16 進数コードで 0xHH 形式で (例:タブは 0x09) 指定してください。CMD.EXE の内部コマンドの前には “cmd /c” が必要です。
/D 日付 最終更新日が指定された日かもしくはそれ以降 (+)、または指定された日またはそれ以前 (-) であるファイルを “yyyy/MM/dd” 形式を使って選択します。または、最終更新日が現在の日にちより “dd” 日あと、もしくは “dd” 日前であるファイルを選択します。有効な”dd”値は 0 から 32768 の間です。指定がない場合は、”+” が既定で使用されます。
/? ヘルプまたは使用法を表示します。
例:
FORFILES /?
FORFILES
FORFILES /P C:\WINDOWS /S /M DNS*.*
FORFILES /S /M *.txt /C “cmd /c type @file | more”
FORFILES /P C:\ /S /M *.bat
FORFILES /D -30 /M *.exe
/C “cmd /c echo @path 0x09 was changed 30 days ago”
FORFILES /D 2001/01/01
/C “cmd /c echo @fname is new since Jan 1st 2001”
FORFILES /D +2017/5/3 /C “cmd /c echo @fname is new today”
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C “cmd /c echo @fsize”
FORFILES /M *.txt /C “cmd /c if @isdir==FALSE notepad.exe @file”
C:\Users>
[/code]自らを「これはバッチ ジョブの使用に便利です」と言うくらい自信満々のコマンドです(^^)
では、引数を簡単にメモっておきます。
/P パス名 検索するパス名を指定します。無指定の時はカレントディレクトリです。
/M 検索マスク 検索するマスク文字を指定します。無指定の時は*です。
/S サブディレクトリに対しても検索します。無指定の時は指定したディレクトリのみです。
/C コマンド 実行するコマンドを指定します。無指定の時は「cmd /c echo @file」つまり、ファイル名を画面に表示します。
/D yyyy/MM/dd または dd 日付(ファイルの最終更新日)指定の引数です。年月日(yyyy/MM/dd)もしくは日(dd)で指定します。ddは0から32768の間です。この日付に+(プラズ)を付けると以降、-(マイナス)を付けると以前の指定になります。
/C コマンドでは以下の変数が使えます。
@file – フィルの名前を返します。
@fname – 拡張子なしのファイル名を返します。
@ext – ファイルの拡張子だけを返します。
@path – ファイルの完全なパスを返します。
@relpath – ファイルの相対パスを返します。
@isdir – ファイルの種類がディレクトリの場合は “TRUE”を、ファイルの場合は”FALSE” を返します。
@fsize – ファイルのサイズをバイトで返します。
@fdate – ファイルの最終更新日を返します。
@ftime – ファイルの最終更新時刻を返します。
linuxのfindの機能限定版って感じのコマンドです。
実際にforfilesを使ってファイルを削除してみる
では、実際にforfilesを使ってファイルを削除してみます。
カレントディレクトリにある去年以前の画像ファイル(png)を全部削除します。
削除は「del」コマンドです。これは内部コマンドなので「cmd /c」が必要です。
ではコマンドラインから
[code]forfiles /M *.png /D -2016/12/31 /C “cmd /c del @file”[/code]と入力します。これで2016/12/31以前のファイルを削除できました。
バッチファイルとして使うのであれば、日付指定ではなく日数で指定するのがいいですよね。
90日以前のファイルを削除するバッチファイルはこんな感じです。
[code]@echo off
rem 削除する日数を指定(d日前)
set day=90
rem 削除するファイルの拡張子を指定
set ext=png
forfiles /M *.%ext% /D -%day% /C “cmd /c del @file
[/code]
コメント