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()