2012-02-07 6 views
3

Я пишу сценарий, который будет зашифровывать журналы и удалять что-либо старше 90 дней на сервере 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 

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

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

Похоже, что было бы проще установить Cygwin и использовать только сценарий. –

+0

@DaveNewton Я не понимаю вашего комментария. Не должны ли рубиновые скрипты, которые не используют внутренние функции оболочки в '' рабочей ОС самостоятельно? Вот почему он пишет сценарий, не так ли? – shime

+0

@shime Сценарий оболочки. –

ответ

1

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

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

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

+0

я смог придумать способ расчета был ли файл 90 дней, выполнив следующие действия: # Определить предельный возраст и вычислить разницу в секундах old_files_age = 7776000 CTime = Time.now past_due_logs = (CTIME - old_files_age) .to_s.split [0] Все работало отлично после того, как я определил эти переменные и вычислил разницу. – Jay

4

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

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 «s ** соответствовать рекурсивно.

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

Смежные вопросы