Wednesday, November 9, 2011

Delete Files by Date With DOS Batch File

I have a server that is continuously filling it's drive with temporary files left over from a video encoding process we use.  Every week or so I have to manually delete the old files to prevent the drive from filling.  Finally today I headed on a journey to figure out a way to programmatically clean up these old files regularly.  So I tooled around the Internet to find a way to do it from the DOS command line.  Unfortunately others had run into the same issue I was, that DOS commands like del don't have a way to delete by date.  I found a few approaches using complex batch files & even tried one for a few minutes, but when I couldn't get it to work I went back to the drawing board.

I found a really old post suggesting using xcopy to copy the newest (presumably the ones to keep) files to a temp location, then delete the original files, then move those copied away back to their original location.  This approach had some promise, but had some real drawbacks too; particularly that I'm dealing with tens of gigabytes & this would take forever, and that I'm dealing with several and varying subdirectories.

Since xcopy has been deprecated and replaced with robocopy in Windows 2008, Windows 7, etc. that's what I chose to use.  In fact, robocopy has a couple switches that make it easy to move (/MOV) files older than x days (/MINAGE:x).

What I ended up with was a simple two line batch file that I'm using Windows task scheduler to run once a day.  The first line moves files older than x days to a temporary location & the second line deletes the moved files.
robocopy D:\Original_Location D:\DelOldFiles * /S /MOV /MINAGE:7
del D:\DelOldFiles\* /s /q
The robocopy syntax is ROBOCOPY source destination [file [file]...] [options].  I'm using the following switches (options):
  • /S - include subdirectories
  • /MOV - move (which is technically a copy, then delete original)
  • /MINAGE:x - act on files older than x days
After the files are moved I'm deleting all files (*), in all subdirectories (/s) in my temp folder, quietly (/q), i.e. don't prompt, just do it.

See also
Using dos to delete based on date

No comments:

Post a Comment