【问题标题】:Efficient way to delete old log files on Windows 16 server?删除 Windows 16 服务器上旧日志文件的有效方法?
【发布时间】:2020-05-26 19:55:49
【问题描述】:

我有超过 10 TB 的日志文件数据。我想找到一种有效的方法来删除超过 3 年的日志文件。最初,我正在考虑安排这个 PowerShell 脚本:

# Delete all Files in PATH older than 3 years (1095 days) old
$Path = "Path to log files"
$Daysback = "-1095"

$CurrentDate = Get-Date
$DatetoDelete = $CurrentDate.AddDays($Daysback)
Get-ChildItem $Path | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item

我担心循环 10 TB 的数据将需要数小时才能运行,即使该脚本似乎在 O(n) 上运行。有人有更好的解决方案吗?

【问题讨论】:

  • 文件占用的空间无关紧要。唯一重要的是文件的数量。
  • 很遗憾,文件很多
  • 我建议去掉-1095 周围的引号并将$DateToDelete 设置为$CurrentDate.AddDays($Daysback).Date 以将其设置为午夜。此外,将开关 -File 添加到 Get-Childitem 以确保您只处理文件,而不是目录。
  • 为什么不用AddYear(-3) 而不是AddDays

标签: windows powershell logging server


【解决方案1】:

如果性能很重要,我会摆脱管道并且不会使用 gci(使用 System.IO 中的较低级别的类型)。如果有数百万个文件,我也会用 c# 编写它,并且只从 ps 运行时调用方法。以下是删除超过 N 天的文件的示例:

Add-Type -TypeDefinition @"

public static class LogCleaner {

  public static void Clean(string dirName, int age)
  {

    foreach (string file in System.IO.Directory.GetFiles(dirName))
    {
      var fi = new System.IO.FileInfo(file);
      if (fi.LastWriteTime < System.DateTime.Now.AddDays(-age))
      {
        fi.Delete();
      }
    }
  }

}

"@

[LogCleaner]::Clean("C:\Temp\demo", 10)

您还可以检查如何使用 Windows 本地实用程序(如 dir)来实现此目的,或者安装 git bash 并尝试以 linux 方式执行此操作(例如使用 find 命令)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多