Sunday, January 16, 2011

Automatic file deletion based on file age

Does anyone know of a good way to delete files based on their age and have it done periodically, say using a batch file and windows scheduler? (Or any other decent software that would do this as well)

  • Yes, I've got one we use. Found it online and made some modifications to it.

    This would be run as

    deletefiles.bat 5 C:\Temp *.LOG 1

    and would delete all the log files in C:\Temp and its subdirectories more than 5 days old

    Ah, found the original post

    @echo off
    
    CLS
    :HouseKeeping
    REM Start Time
    REM This will load the current time into 'Start' variables.
    REM.
    Set Start_Time=%time%
    FOR /f "tokens=1-3 delims=:." %%a in ('echo %time%') do (
    set Start_hh=%%a
    set Start_mm=%%b
    set Start_ss=%%c
    )
    
    FOR /f "tokens=1-3 delims=: " %%a in ('time /t') do (set Start_Meridan=%%c)
    Echo Start Time: %Start_hh%:%Start_mm%:%Start_ss% %Start_Meridan%
    REM Echo Start Time: %Start_hh%:%Start_mm%:%Start_ss%
    
    Set Delete_Counter=0
    Set FChecked_Counter=0
    Set Total_Files=0
    Set Finish_day=0
    SET OLDERTHAN=%1
    SET FileDir=%~2
    SET EXT=%3
    SET Sub_Dir=%4
    SET Force_Check=%5
    IF NOT DEFINED OLDERTHAN GOTO SYNTAX
    IF NOT DEFINED FileDir GOTO SYNTAX
    IF NOT DEFINED EXT GOTO SYNTAX
    IF NOT DEFINED Force_Check Goto Get_Date
    IF DEFINED Force_Check Goto Read_Only
    Goto Exit
    
    :Read_Only
    IF %Force_Check%==1 set Force_Delete=/F
    Goto Get_Date
    
    REM Get Todays Date
    :Get_Date
    FOR /f "tokens=1-4 delims=/- " %%a in ('date /t') do (
    set xx=%%a
    set mm=%%b
    set dd=%%c
    set yyyy=%%d
    )
    
    set /A mm=%mm%+0
    if %dd%==01 set dd=1
    if %dd%==02 set dd=2
    if %dd%==03 set dd=3
    if %dd%==04 set dd=4
    if %dd%==05 set dd=5
    if %dd%==06 set dd=6
    if %dd%==07 set dd=7
    if %dd%==08 set dd=8
    if %dd%==09 set dd=9
    set /A dd=%dd%+0
    set /A dd=%dd% - %OLDERTHAN%
    set /A yyyy=%yyyy%+0
    :LOOPDATE
    
    if /I %dd% GTR 0 Goto DONE
    set /A mm=%mm% - 1
    if /I %mm% GTR 0 Goto ADJUSTDAY
    set /A mm=12
    set /A yyyy=%yyyy% - 1
    :ADJUSTDAY
    if %mm%==1 Goto SET31
    if %mm%==2 Goto LEAPCHK
    if %mm%==3 Goto SET31
    if %mm%==4 Goto SET30
    if %mm%==5 Goto SET31
    if %mm%==6 Goto SET30
    if %mm%==7 Goto SET31
    if %mm%==8 Goto SET31
    if %mm%==9 Goto SET30
    if %mm%==10 Goto SET31
    if %mm%==11 Goto SET30
    if %mm%==12 Goto SET31
    :SET31
    set /A dd=31 + %dd%
    Goto LOOPDATE
    
    :SET30
    set /A dd=30 + %dd%
    Goto LOOPDATE
    
    :LEAPCHK
    set /A tt=%yyyy% %% 4
    if not %tt%==0 Goto SET28
    set /A tt=%yyyy% %% 100
    if not %tt%==0 Goto SET29
    set /A tt=%yyyy% %% 400
    if %tt%==0 Goto SET29
    
    :SET28
    set /A dd=28 + %dd%
    Goto LOOPDATE
    
    :SET29
    set /A dd=29 + %dd%
    
    :DONE
    if /i %dd% LSS 10 set dd=0%dd%
    rem if /I %mm% LSS 10 set mm=0%mm%
    
    :Search_Type
    IF NOT DEFINED Sub_Dir GOTO No_Sub_Dir
    If %Sub_Dir%==0 Goto :No_Sub_Dir
    If %Sub_Dir%==1 Goto :Sub_Directory
    Else Goto :No_Sub_Dir
    
    :No_Sub_Dir
    for %%i in (%FileDir%\%EXT%) do (
    set FileName=%%i
    call :PROCESSFILE %%~ti)
    
    Goto Print_Results
    
    :Sub_Directory
    for /R %FileDir% %%i in (%EXT%) DO (
    set FileName=%%i
    call :PROCESSFILE %%~ti)
    Goto Print_Results
    
    :Print_Results
    Echo.
    Echo The number of files deleted : %Delete_Counter%
    Echo.
    Echo The number of files passed over : %FChecked_Counter%
    Echo.
    Echo The Total number of files processed: %Total_Files%
    Echo.
    Goto Get_Finish_Time
    
    :Get_Finish_Time
    REM This will load the current time into 'Finish' variables.
    REM.
    FOR /f "tokens=1-3 delims=:." %%a in ('echo %time%') do (
    set Finish_hh=%%a
    set Finish_mm=%%b
    set Finish_ss=%%c
    )
    FOR /f "tokens=1-3 delims=: " %%a in ('time /t') do (set Finish_Meridan=%%c)
    Goto Calculate_Time
    
    :Calculate_Time
    REM Calculate the difference in time between Start and Finish times
    REM.
    
    IF %Start_ss% GTR %Finish_ss% (
    set /A Finish_ss=%Finish_ss%+60
    set /A Finish_mm=%Finish_mm%-1
    )
    set /A Diff_ss=%Finish_ss%-%Start_ss%
    
    IF %Start_mm% GTR %Finish_mm% (
    set /A Finish_mm=%Finish_mm%+60
    set /A Finish_hh=%Finish_hh%-1
    )
    set /A Diff_mm=%Finish_mm%-%Start_mm%
    
    IF %Start_hh% GTR %Finish_hh% (
    set /A Finish_hh=%Finish_hh%+24
    set Finish_day=1
    )
    set /A Diff_hh=%Finish_hh%-%Start_hh%
    
    REM The follow will adjust for negative time values.
    REM.
    REM if %Diff_hh% LSS 0 (set /A Diff_hh=%Diff_hh%+23)
    REM if %Diff_mm% LSS 0 (set /A Diff_mm=%Diff_mm%+59)
    REM if %Diff_ss% LSS 0 (set /A Diff_ss=%Diff_ss%+59)
    REM The following will compensate for single digit results.
    REM.
    if %Diff_hh%==0 set Diff_hh=00
    if %Diff_hh%==1 set Diff_hh=01
    if %Diff_hh%==2 set Diff_hh=02
    if %Diff_hh%==3 set Diff_hh=03
    if %Diff_hh%==4 set Diff_hh=04
    if %Diff_hh%==5 set Diff_hh=05
    if %Diff_hh%==6 set Diff_hh=06
    if %Diff_hh%==7 set Diff_hh=07
    if %Diff_hh%==8 set Diff_hh=08
    if %Diff_hh%==9 set Diff_hh=09
    if %Diff_mm%==0 set Diff_mm=00
    if %Diff_mm%==1 set Diff_mm=01
    if %Diff_mm%==2 set Diff_mm=02
    if %Diff_mm%==3 set Diff_mm=03
    if %Diff_mm%==4 set Diff_mm=04
    if %Diff_mm%==5 set Diff_mm=05
    if %Diff_mm%==6 set Diff_mm=06
    if %Diff_mm%==7 set Diff_mm=07
    if %Diff_mm%==8 set Diff_mm=08
    if %Diff_mm%==9 set Diff_mm=09
    if %Diff_ss%==0 set Diff_ss=00
    if %Diff_ss%==1 set Diff_ss=01
    if %Diff_ss%==2 set Diff_ss=02
    if %Diff_ss%==3 set Diff_ss=03
    if %Diff_ss%==4 set Diff_ss=04
    if %Diff_ss%==5 set Diff_ss=05
    if %Diff_ss%==6 set Diff_ss=06
    if %Diff_ss%==7 set Diff_ss=07
    if %Diff_ss%==8 set Diff_ss=08
    if %Diff_ss%==9 set Diff_ss=09
    Goto Print_Time
    
    :Print_Time
    REM This will return the results to the user.
    REM.
    Set End_Time=%time%
    Echo.
    Echo The program started at: %Start_Time% %Start_Meridan%
    Echo The program ended at : %End_Time% %Finish_Meridan%
    Echo hh:mm:ss.mm
    Echo.
    Echo This is the amount of time elapsed from the
    Echo start to the end of the program executing.
    Echo.
    Echo %Diff_hh%:%Diff_mm%:%Diff_ss%
    Echo hh:mm:ss
    Echo. Number of Days Elapsed: %Finish_day%
    
    Goto Reset_Variables
    
    :Reset_Variables
    
    REM The following will reset the variables used by this program.
    REM A.K.A. cleaning up.
    set mm=
    set yyyy=
    set dd=
    set thedate=
    set xx=
    set tt=
    set FileDir=
    set FileName=
    set ext=
    set OlderThan=
    set Sub_Dir=
    set Delete_Counter=
    set Total_Files=
    set FChecked_Counter=
    set Force_Check=
    set Force_Delete=
    set Diff_hh=
    set Diff_mm=
    set Diff_ss=
    set Start_hh=
    set Start_mm=
    set Start_ss=
    set Start_Meridan=
    set Finish_hh=
    set Finish_mm=
    set Finish_ss=
    set Finish_Meridan=
    set mm=
    set hh=
    set ss=
    set Start_Time=
    set End_Time=
    set Finish_day=
    Goto Exit
    
    
    GOTO Exit
    
    :PROCESSFILE
    set temp=%1
    set fyyyy=%temp:~6%
    
    if /I %fyyyy% LSS 100 set fyyyy=20%fyyyy%
    if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6%
    
    set fmm=%temp:~0,2%
    set fdd=%temp:~3,2%
    
    :: +*************************************+
    :: | This is where the files are deleted |
    :: | Change the DIR command to DEL to |
    :: | delete. DIR is used for test. |
    :: +*************************************+
    
    if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% (
    rem Echo %yyyy%/%mm%/%dd% "- The selected file will be deleted.  F: " %fyyyy%/%fmm%/%fdd% %FileName% >> files.txt
    echo %FileName% >> d:\deletelog%yyyy%-%mm%-%dd%.txt
    del %FileName% >> d:\deletelog%yyyy%-%mm%-%dd%.txt
    rem Dir %Force_Delete% "%FileName%"
    Set /A Delete_Counter=%Delete_Counter%+1
    Set /A Total_Files=%Total_Files%+1
    Echo.
    ) Else (
    rem Echo %yyyy%/%mm%/%dd% " - The selected file does not qualify for deletion. F: " %fyyyy%/%fmm%/%fdd% %FileName%  "%FileName%" >> files.txt
    Set /A FChecked_Counter=%FChecked_Counter%+1
    Set /A Total_Files=%Total_Files%+1
    Echo.) 
    
    set temp=
    set fyyyy=
    set fmm=
    set fdd=
    
    :EXIT
    
    Jessica McKinnon : OMG, that's one of the longest scripts that I have seen in a the longest time that does something that you can do with a single command ;-) ServerFault should introduce an award for this kind of post... this script almost make calculating 5+5 using one's fingers seem high-tech!
    From dubRun
  • You can use the forfiles commnad. Just use the windows scheduler to schedule it directly.

    Some more examples.

  • Here's a Powershell script you can use in a scheduled task. (Also used this in this answer for purging IIS log files).

    set-location [enter-path-to-folder]
    foreach ($File in get-childitem) {
       if ($File.LastWriteTime -lt (Get-Date).AddDays(-30)) {
          del $File
       }
    }
    

    Change the folder path to your target, tweak AddDays as appropriate. -30 removes things older than 30 days.

    From squillman
  • +1 for 'forfiles"

    here's what I use in a batch file that runs nightly:

    forfiles -pE:\myfolder\mysubfolder -m*.* -d-5 -c"cmd /C del /q @FILE"

    jjrab : Perfect - this is exactly what I'm looking for, thanks a bunch!
    From dogmanky

0 comments:

Post a Comment