Exluir arquivos com mais de X dias de idade

Todos nós, administradores de sistema, temos problemas com arquivos de log lotando o disco rígido. Mas agora você vai poder determinar que os arquivos com mais de X dias sejam deletados do seu sistema de forma simples.

Estou falando de uma ferramenta simples e gratuita da Microsoft, incluída em algumas versões do Windows chamada “Forfiles”

O Forfiles irá executar comandos em arquivos e pastas que correspontam à determinados critérios. Ele permite que você defina curingas, escolha apenas pastas, apenas arquivos, e o mais importante é que ele permite que você especifique algo como “Eu só quero os arquivos que tem mais de um dia de idade”

Primeiro, deixe-me mostrar os possíveis argumentos dele:

/P Path Name: Indica o path para iniciar a busca. A pasta padrão é a pasta de trabalho atual.

/M Search Mask: Pesquisa arquivos de acordo com uma máscara de busca. A máscara de pesquisa padrão é “*”

/S SubDirectories: Orienta o Forfiles a fazer uma busca recursiva em sub-diretórios. Similar ao comando “dir /s” do DOS.

/C Command: Indica o comando à ser executado para cada arquivo. Cadeias de comandos devem ser inseridas em aspas duplas.

As seguintes variáveis podem ser utilizadas na cadeia de comandos:

@File – retorna o nome do arquivo.
@Fname – retorna o nome do arquivo sem extensão.
@Ext – retorna apenas a extensão do arquivo.
@Path – retorna o caminho completo do arquivo.
@Relpath – retorna o caminho relativo do arquivo.
@Isdir – retorna “TRUE” se um tipo de arquivo é um diretório, e “falso” para arquivos.
@Fsize – retorna o tamanho do arquivo em bytes.
@Fdate – retorna a data da última modificação do arquivo.
@Ftime – retorna o tempo da última modificação do arquivo.

Para incluir caracteres especiais na linha de comando, use o código hexadecimal para o caracter no formato 0xHH (ex.: 0x09 para um tab).

Comandos cmd.exe internos devem ser precedidos de “cmd c /”.

/D data seleciona arquivos em que a data da última modificação foram maior ou igual a (+), ou menor ou igual a (-), à data especificada usando o formato “yyyy/MM/dd”, ou seleciona arquivos com a data da última modificação seja maior ou igual a (+) data atual mais “dd” dias, ou menor ou igual a (-) data atual menos “dd” dias. São válidos quaisquer números “dd” no intervalo de 0 à 32768. O “+” é tomado como sinal padrão se não especificado.

Legal, então vamos ao que interessa:

Vamos começar com o caminho. Queremos que ele procure em c:windowstemp

forfiles  -p "c:windowstemp"

Quero incluir subpastas:

forfiles -p "c:windowstemp" -s

Usando a opção de data, eu quero qualquer coisa com mais de um dia de idade:

forfiles -p "c:windowstemp" -s -d -1

Eu só quero apagar os arquivos que terminam com .tmp:

forfiles -p "c:windowstemp" -s -d -1 -m *.tmp

E, finalmente, o comando que desejo executar nos arquivos encontrados, no caso é o DEL:

forfiles -p "c:windowstemp" -s -d -1 -m *.tmp -c "cmd /c del /f /q @path"

Observe o uso da variável @path – é uma das muitas variáveis que o Forfiles reconhece.

Então é isso – uma linha de comando que vai apagar arquivos da nossa pasta temp com mais de 1 dia de idade:

forfiles -p "c:windowstemp" -s -d -1 -m *.tmp -c "cmd /c del /f /q @path"

E pronto! Agora é só você criar uma tarefa agendada para rodar o comando acima uma vez por semana.

Se sua cópia do Windows não tem o Forfiles, você pode baixá-lo a partir do servidor FTP da Microsoft aqui:

ftp://ftp.microsoft.com/ResKit/y2kfix/x86/

Estou realmente impressionado com este pequeno utilitário e as suas infinitas possibilidades.

Apenas para deixar vocês informados:

Acredito que essas versões do Windows possuem por padrão:

Windows 2003
Windows 2008
Windows Vista
Windows 7

Essas versões não:

Windows 2000
Windows XP

Espero que ajude.

  • bruno

    Muito bom este artigo!! depois de muito tempo de pesquisa na net consegui acha-lo e resolver o problema de eliminar os arquivos antigos com segurança.

    Aproveito para deixar uma dúvida:

    Como poderemos apagar todo o diretório, incluindo as pastas? (ao executar apagou tudo mas manteve as pastas)

    Obrigado!

  • bruno

    Por favor, tenho outra dúvida…ao utilizar o comando no windows xp, não estou a conseguir aplicar o comando de exemplo:

    forfiles -p “c:windowstemp” -s -d -1 -m *.tmp -c “cmd /c del /f /q @path”

    Penso que a interpretação é diferente. Pode ajudar-me a colocar o comando correto para poder usar também no xp??

    Obrigado!

  • eduardo

    Muito obrigado, adorei seu site! Eu queria ha anos esse comando e nunca sabia como fazer. Coisa mais simples, muito obrigado mesmo!!!!

  • eduardo

    Amigo como eu faco pra adicionar mais extensoes? Queria que ele incluisse qualquer arquivo por exemplo de uma determinada pasta! tentei tirar o *.tmp mas nao deu, tentei botar *.* e nao deu tambem. como faco!!?

  • Luiz Augusto

    Ricardo,

    Preciso desse comando mas para apagar as pastas dos dirtórios do usuário ex.: rodrigo*, Bianca*, deixando somente a pasta dos usuários.
    Como eu faria ???? Tentei essas 2 opções e não deu certo.

  • Jonas Henrique

    Me ajudou muito, o forfiles é muito útil. Valeu!

  • Dalva

    Este comando é tudo que eu procurava no Windows…

  • Orison

    Show!

  • Olá,

    deixando apenas uma ajuda tbm!!

    Caso alguém precise deletar os diretórios antigos e não somente os arquivos pode usar a seguinte opção:

    REM INICIO BAT
    set qtde_dias = 2
    forfiles -p “h:BackupSystextilOracle” /D -%qtde_dias% -c “cmd /c rd /s /q @path”
    REM FIM BAT

    O que mudei foi o comando a ser executado, ao invés de DEL coloquei o RD…

    Vlw, bom POST!!!

    • joarez ferreira

      Daniel,

      Estou precisando de um BAT, que delete no diretorio somente as pastas vazias não que delete todas as que contem documentos. Ja fiz de tudo ainda nao encontrei a solucao.
      Pode me ajudar?

    • suporte3 Exxe Informárica

      Cara, valew!!! Valew Muito!!!

  • Show!

  • Ótimo. Obrigado.

  • Rafaela

    E se eu precisar deletar os arquivos do dia?

  • Max

    Muito bom Ricardo. Parabéns por compartilhar seus conhecimentos. Não conhecia esse comando.

  • Rafael

    Ola pessoal estou com a seguinte situação meu backup e salvo na unidade D: , tenho o winrar instalado na unidade C: como faço para zipar o arquivo da unidade D: na bat abaixo:

    “C:Program FilesWinRARRar.exe” a -agDDMMYYYY D:mssqlBACKUPDIARIO D:mssqlBACKUPDIARIO*.*
    DEL D:mssqlBACKUPDIARIO*.bak
    xcopy/e/h/d/v/y “D:mssqlBACKUPDIARIO” F:mssqlsalvos
    DEL D:mssqlBACKUPDIARIO*.RAR

  • Pingback: Rotacionando seus logs no Windows - Ricardo Martins()

  • Alexandre

    Parabéns pelo tutorial.
    Testei aqui e funcionou..era o que eu estava procurando.
    Obrigado

  • Marcelo S Freitas

    Muito bom !!

  • Luciano

    Parabéns pelo POST !
    Nunca tinha ouvido falar nessa fantástica ferramenta, que inclusive esta disponivel no Windows 10 e Server 2016.

    Agradeço pelo apoio, em nome da comunidade !