删除超过90天的日志

时间:2012-02-07 21:30:07

标签: ruby

我正在编写一个脚本,它将压缩日志并删除Windows 2008 Server上超过90天的任何内容。我接近做了以下事情:

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 个答案:

答案 0 :(得分:5)

这是一种与OS无关的惯用的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**来递归匹配。

(顺便提一下,您可以考虑在shell中find . -mtime +90 -type f -print0 | xargs -0 rm更高效并避免separator problem

答案 1 :(得分:1)

你的脚本没有做到你想要的是什么?我看到的唯一重要的缺失是测试它是-type f命令中的文件或目录find

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

唯一的另一件事是测试它是否超过90天,但你应该能够很容易地解决这个问题。