如何从目录中删除旧文件,同时在Windows上保留最新文件

如何从目录中删除旧文件,同时在Windows上保留最新文件

How do I delete old files from a directory while keeping the most recent ones on Windows

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Batch file to delete files older than N days

我想运行一个计划的Windows任务,删除目录中超过2周的所有文件。

原因是这些是填充我的服务器的IIS和Tomcat日志,但我想保留最新的日志以防我需要调查问题。

有没有人知道这样做的简单方法?

干杯

的NiGe


确切的语法:FORFILES /p d:
ew /d -30 /m * /c"cmd /c del @file"


使用VBScript,改编自ScriptingAnswers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Dim fso, startFolder, OlderThanDate
Set fso = CreateObject("Scripting.FileSystemObject")

startFolder ="E:\temp"           ' folder to start deleting (subfolders will also be cleaned)

OlderThanDate = DateAdd("d", -07, Date)  ' 07 days (adjust as necessary)

DeleteOldFiles startFolder, OlderThanDate

Function DeleteOldFiles(folderName, BeforeDate)
    Dim folder, file, fileCollection, folderCollection, subFolder

    Set folder = fso.GetFolder(folderName)

    Set fileCollection = folder.Files

    For Each file In fileCollection
        If file.DateLastModified < BeforeDate Then
            ' fso.DeleteFile(file.Path)    # Modify this to delete after testing
            WScript.StdOut.WriteLine (file.Path)
        End If
    Next

    Set folderCollection = folder.SubFolders
    For Each subFolder In folderCollection
        DeleteOldFiles subFolder.Path, BeforeDate
    Next

End Function

您可以使用CScript运行此脚本

@Jason:很好的实用程序,来自Resource Kit的FORFILES


最简单的方法是每周或每月运行一次.bat运行文件。

1
2
3
4
cd \mylog\dir
mkdir archive
del /Q .\archive\*.log
move *.log .\archive

如果你想要更复杂的东西,可以下载cygwin工具来使用un * x之类的命令,或者看看Powershell。


安排批处理文件来处理这个问题。

此行将删除c: mydirectory中超过14天的所有文件(*。*):

1
FORFILES -pc:\mydirectory -s -m*.* -d-14 -c"DEL @FILE"

将它放在一个文本文件中,将其重命名为"deletefiles.bat"并安排它。

我没有测试过这个,但应该很容易尝试。

编辑:如果你使用它,请确保你了解发生了什么 - -s标志告诉它递归子目录,这可能不是你想要发生的。此外,您可能还需要为DEL命令指定一些标志。 :)

编辑:意识到你需要从微软下载东西才能使FORFILES正常工作。我也喜欢被接受的解决方案,因为你没有任何特别的东西。唯一的问题是它只会每两周发生一次,而不是每天运行一个进程来删除超过14天的所有内容。这是值得的。 :P


如果您在服务器上安装了perl(或类似的),那么这很简单:

1
2
3
4
5
6
7
#!perl
foreach my $file (</path/to/logs/*.log>) {
  next unless -M $file > 14;
  print"Deleting $file...
";
  # unlink $file or die"Failed to remove $file: $!";
}

实际执行删除的行被注释掉了,因为房子里可能有孩子:)


为什么不编写批处理文件或PowerShell脚本并安排它?

用于删除早于指定日期的文件的脚本。


推荐阅读