Удалить журналы старше 90 дней - PullRequest
3 голосов
/ 08 февраля 2012

Я пишу сценарий, который будет архивировать журналы и удалять все, что старше 90 дней на Windows 2008 Server. Я подошел ближе, сделав следующее:

def remove_old_logs()
  d = Time.now.localtime.strftime("%m-%d-%Y")
  tfile = "c:/slog/sec/Archive/#{d}-logs.zip"
  mtme=File.stat(tfile).mtime.to_s.split[0]

  # Compare the old mtime with the old and remove the old.
  Dir["c:/slog/sec/Archive/*"].each do |file|
    ntme=File.stat(file).mtime.to_s.split[0]
    FileUtils.rm( file ) if mtme > ntme #'Time.now.localtime.strftime("%Y-%m-%d")'
  end
end

Что мне нужно сделать, чтобы заставить Ruby сделать эквивалент Linux:

find . -mtime +90 -type f -exec rm {} \;

Ответы [ 2 ]

5 голосов
/ 23 апреля 2014

Вот несколько идиоматичный способ Ruby, который не зависит от ОС,

require 'date'

module Enumerable
  def older_than_days(days)
    now = Date.today
    each do |file|
      yield file if (now - File.stat(file).mtime.to_date) > days
    end
  end
end

# Example emulating `find /path/to... -mtime +90 -type f -exec rm {} \;`
Dir.glob('/path/to/your/files/**/*').older_than_days(90) do |file|
  FileUtils.rm(file) if File.file?(file)
end

Обратите внимание на использование Dir.glob * ** для рекурсивного соответствия.

(Между прочим, вы можете рассмотреть в командной оболочке find . -mtime +90 -type f -print0 | xargs -0 rm более эффективный способ избежать проблемы с разделителем )

1 голос
/ 08 февраля 2012

Что ваш сценарий не делает, что вы хотите? Единственное, что я вижу, чего не хватает - это проверка, является ли это файл или каталог, -type f в команде find.

File.file?('path/to/file')

Единственное, что нужно, это тест, чтобы определить, старше 90 дней, но вы должны быть в состоянии понять это достаточно легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...