CleanupDir

Remove arquivos de uma série cujo nome atenda a uma determinada máscara, preservando versões mais recentes desses arquivos, conforme especificado pelo parâmetro “-k”. É útil para limpar diretórios com arquivos de log, por exemplo, preservando somente os mais recentes.

CÓDIGO

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Programa: cleanupdir.py
# Função..: Remove arquivos fora do período especificado.
# Autor...: Megumi Jr. ([email protected])
VERSION = "1.0"
#

import commands, getopt
import os, sys, time, glob

#Variáveis globais
SCRIPTNAME = ""                          # Nome desse script
MATCH = ""                               # Padrão de pesquisa
KEEP = 0                                 # Nro. de dias a preservar
TEST = False
SILENT = False

def main():
   global TEST, SCRIPTNAME, MATCH, KEEP, TEST, SILENT

   #Obtem argumentos
   getArgs()
   
   #Início
   #printLogMsg("Inicio de execucao.")

   #Remove arquivos antigos
   cleanUpFiles(MATCH, KEEP, TEST, SILENT)
   
   #Fim
   #printLogMsg("Fim de execucao.")
#end main


def getArgs():
   """Obtem e faz consistência dos argumentos"""
   global TEST, SCRIPTNAME, MATCH, KEEP, SILENT

   #Captura parâmetros
   try:
      opts, args = getopt.getopt(sys.argv[1:], "htsm:k:", \
         ["help", "test", "silent", "match=", "keep="])
   except getopt.GetoptError, err:
      # print help information and exit:
      print str(err) # will print something like "option -a not recognized"
      usage()
      sys.exit(2)
   #endTry
   
   #Obtem o nome do script
   SCRIPTNAME = os.path.basename(sys.argv[0])
   
   #Trata opções
   MATCH = None
   KEEP = None
   for o, a in opts:
      if o in ("-h", "--help"):
         usage()
         sys.exit()
      elif o in ("-t", "--test"):
         TEST = True
      elif o in ("-s", "--silent"):
         SILENT = True
      elif o in ("-m", "--match"):
         MATCH = a
      elif o in ("-k", "--keep"):
         if a.isdigit():
            KEEP = int(a)
         else:
            KEEP = 0 #força invalido
         #endIf
      else:
         assert False, "unhandled option"
   #endfor
   
   #Verifica argumentos
   errmsg = ""
   if (opts == []): #Se não houver parametro nenhum...
      errmsg = "missing options"
   else:
      if (MATCH == None):
         errmsg = "missing option: -m"
      elif (MATCH == SCRIPTNAME) or (MATCH == ""):
         errmsg = "invalid argument for -m"
      #endIf
      if (KEEP == None):
         errmsg = "missing option: -k"
      elif (KEEP < 1): errmsg = "invalid argument for -k" #endIf #endIf if (errmsg != ""): print errmsg usage() sys.exit(2) #endIf #endDef def usage(): """Exibe help""" global VERSION print print "CleanUpDir v", VERSION print print "Uso: cleanupdir [-h]|[-t -s] -m {mascara} -k {versoes}" print print "Remove arquivos com diferentes versoes, conforme a mascara de" print "pesquisa especificada, mantendo os arquivos mais recentes de" print "acordo com o numero de versoes desejado." print print "Opções:" print "-h, --help Exibe o help de comandos" print "-m, --match Mascara que especifique os nomes de arquivos desejados" print " para remocao. Deve ser especificado com o caminho e" print " entre aspas" print "-k, --keep Numero de versoes do mesmo arquivo a serem mantidos." print " Deve ser numerico maior que zero." print "-t, --test Exibe os arquivos que serao removidos sem remove-los." print "-s, --silent Nao exibe mensagens." print print "Exemplo:" print 'cleanupdir -m "/var/log/messages*" -k 5' print #endDef #----- Funções Genericas ----------------------------------------------------- def cleanUpFiles(match, keep, test, silent): """Remove arqs com padrão 'match', mantendo 'keep' arqs mais recentes""" printLogMsg("Verificando remocao de arquivos...", silent) #Processa arquivos que atendam ao padrão files = filter(os.path.isfile, glob.glob(match)) #Classifica os arquivos por data descendente files.sort(key=lambda x: os.path.getmtime(x)) files.reverse() #Remove os arquivos cont = 0 for fname in files: fn = os.path.basename(fname) if (fn != os.path.basename(sys.argv[0])): #evita o arquivo do script cont += 1 if (cont > keep):
            if (test == True):
               printLogMsg("A ser removido: %s" % (fn), silent)
            else:
               printLogMsg("Removendo arquivo: %s" % (fn), silent)
               os.remove(fname)
            #endIf
         #endIf
      #endIf
   #endFor
#end cleanUpFiles   


def printLogMsg(msg, silent):
   """Imprime mensagem de log com data e hora correntes."""
   if (silent == True):
      return
   #endIf
   t = time.localtime(time.time())
   lmsg = "%02d/%02d/%d %02d:%02d - %s" % (t[2], t[1], t[0], t[3], t[4], msg)
   print lmsg
   sys.stdout.flush()
   return
#end printLogMsg


if __name__ == "__main__":
   main()

 

Os comentários estão desativados.