{"id":317,"date":"2017-11-07T16:40:21","date_gmt":"2017-11-07T18:40:21","guid":{"rendered":"http:\/\/megumijr.com\/blog\/?page_id=317"},"modified":"2017-11-07T16:40:21","modified_gmt":"2017-11-07T18:40:21","slug":"cleanupdir","status":"publish","type":"page","link":"https:\/\/megumijr.com\/blog\/biblioteca-de-scripts\/cleanupdir\/","title":{"rendered":"CleanupDir"},"content":{"rendered":"<p>Remove arquivos de uma s\u00e9rie cujo nome atenda a uma determinada m\u00e1scara, preservando vers\u00f5es mais recentes desses arquivos, conforme especificado pelo par\u00e2metro &#8220;-k&#8221;. \u00c9 \u00fatil para limpar diret\u00f3rios com arquivos de log, por exemplo, preservando somente os mais recentes.<\/p>\n<h3>C\u00d3DIGO<\/h3>\n<pre>#!\/usr\/bin\/python\r\n# -*- coding: UTF-8 -*-\r\n# Programa: cleanupdir.py\r\n# Fun\u00e7\u00e3o..: Remove arquivos fora do per\u00edodo especificado.\r\n# Autor...: Megumi Jr. (mail@megumijr.com)\r\nVERSION = \"1.0\"\r\n#\r\n\r\nimport commands, getopt\r\nimport os, sys, time, glob\r\n\r\n#Vari\u00e1veis globais\r\nSCRIPTNAME = \"\"                          # Nome desse script\r\nMATCH = \"\"                               # Padr\u00e3o de pesquisa\r\nKEEP = 0                                 # Nro. de dias a preservar\r\nTEST = False\r\nSILENT = False\r\n\r\ndef main():\r\n   global TEST, SCRIPTNAME, MATCH, KEEP, TEST, SILENT\r\n\r\n   #Obtem argumentos\r\n   getArgs()\r\n   \r\n   #In\u00edcio\r\n   #printLogMsg(\"Inicio de execucao.\")\r\n\r\n   #Remove arquivos antigos\r\n   cleanUpFiles(MATCH, KEEP, TEST, SILENT)\r\n   \r\n   #Fim\r\n   #printLogMsg(\"Fim de execucao.\")\r\n#end main\r\n\r\n\r\ndef getArgs():\r\n   \"\"\"Obtem e faz consist\u00eancia dos argumentos\"\"\"\r\n   global TEST, SCRIPTNAME, MATCH, KEEP, SILENT\r\n\r\n   #Captura par\u00e2metros\r\n   try:\r\n      opts, args = getopt.getopt(sys.argv[1:], \"htsm:k:\", \\\r\n         [\"help\", \"test\", \"silent\", \"match=\", \"keep=\"])\r\n   except getopt.GetoptError, err:\r\n      # print help information and exit:\r\n      print str(err) # will print something like \"option -a not recognized\"\r\n      usage()\r\n      sys.exit(2)\r\n   #endTry\r\n   \r\n   #Obtem o nome do script\r\n   SCRIPTNAME = os.path.basename(sys.argv[0])\r\n   \r\n   #Trata op\u00e7\u00f5es\r\n   MATCH = None\r\n   KEEP = None\r\n   for o, a in opts:\r\n      if o in (\"-h\", \"--help\"):\r\n         usage()\r\n         sys.exit()\r\n      elif o in (\"-t\", \"--test\"):\r\n         TEST = True\r\n      elif o in (\"-s\", \"--silent\"):\r\n         SILENT = True\r\n      elif o in (\"-m\", \"--match\"):\r\n         MATCH = a\r\n      elif o in (\"-k\", \"--keep\"):\r\n         if a.isdigit():\r\n            KEEP = int(a)\r\n         else:\r\n            KEEP = 0 #for\u00e7a invalido\r\n         #endIf\r\n      else:\r\n         assert False, \"unhandled option\"\r\n   #endfor\r\n   \r\n   #Verifica argumentos\r\n   errmsg = \"\"\r\n   if (opts == []): #Se n\u00e3o houver parametro nenhum...\r\n      errmsg = \"missing options\"\r\n   else:\r\n      if (MATCH == None):\r\n         errmsg = \"missing option: -m\"\r\n      elif (MATCH == SCRIPTNAME) or (MATCH == \"\"):\r\n         errmsg = \"invalid argument for -m\"\r\n      #endIf\r\n      if (KEEP == None):\r\n         errmsg = \"missing option: -k\"\r\n      elif (KEEP &lt; 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\u00e7\u00f5es:\" 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\u00e7\u00f5es Genericas ----------------------------------------------------- def cleanUpFiles(match, keep, test, silent): \"\"\"Remove arqs com padr\u00e3o 'match', mantendo 'keep' arqs mais recentes\"\"\" printLogMsg(\"Verificando remocao de arquivos...\", silent) #Processa arquivos que atendam ao padr\u00e3o 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 &gt; keep):\r\n            if (test == True):\r\n               printLogMsg(\"A ser removido: %s\" % (fn), silent)\r\n            else:\r\n               printLogMsg(\"Removendo arquivo: %s\" % (fn), silent)\r\n               os.remove(fname)\r\n            #endIf\r\n         #endIf\r\n      #endIf\r\n   #endFor\r\n#end cleanUpFiles   \r\n\r\n\r\ndef printLogMsg(msg, silent):\r\n   \"\"\"Imprime mensagem de log com data e hora correntes.\"\"\"\r\n   if (silent == True):\r\n      return\r\n   #endIf\r\n   t = time.localtime(time.time())\r\n   lmsg = \"%02d\/%02d\/%d %02d:%02d - %s\" % (t[2], t[1], t[0], t[3], t[4], msg)\r\n   print lmsg\r\n   sys.stdout.flush()\r\n   return\r\n#end printLogMsg\r\n\r\n\r\nif __name__ == \"__main__\":\r\n   main()\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Remove arquivos de uma s\u00e9rie cujo nome atenda a uma determinada m\u00e1scara, preservando vers\u00f5es mais recentes desses arquivos, conforme especificado pelo par\u00e2metro &#8220;-k&#8221;. \u00c9 \u00fatil para limpar diret\u00f3rios com arquivos de log, por exemplo, preservando somente os mais recentes. C\u00d3DIGO #!\/usr\/bin\/python # -*- coding: UTF-8 -*- # Programa: cleanupdir.py # \u2026 <a class=\"continue-reading-link\" href=\"https:\/\/megumijr.com\/blog\/biblioteca-de-scripts\/cleanupdir\/\">Continue lendo <span class=\"meta-nav\">&rarr; <\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":292,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/317"}],"collection":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/comments?post=317"}],"version-history":[{"count":1,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/317\/revisions"}],"predecessor-version":[{"id":318,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/317\/revisions\/318"}],"up":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/292"}],"wp:attachment":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/media?parent=317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}