Эффективный способ удалить старые файлы журнала на сервере Windows 16? - PullRequest
0 голосов
/ 26 мая 2020

У меня более 10 ТБ данных файла журнала. Я хочу найти эффективный способ удаления файлов журналов старше 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 ТБ данных уйдет несколько часов, даже если этот сценарий, похоже, выполняется на O (n). Есть ли у кого-нибудь лучшее решение?

1 Ответ

0 голосов
/ 27 мая 2020

Если производительность имеет значение, я бы избавился от каналов и не использовал бы 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)

...