Como excluo arquivos antigos de um diretório enquanto mantenho os mais recentes no Windows [duplicado]
-
09-06-2019 - |
Pergunta
Possível duplicata:
Arquivo em lote para excluir arquivos com mais de N dias
Quero executar uma tarefa agendada do Windows que exclua todos os arquivos de um diretório com mais de duas semanas.
O motivo é que esses são os logs do IIS e do Tomcat que preenchem meu servidor, mas quero manter os logs mais recentes caso precise investigar um problema.
Alguém sabe uma maneira fácil de fazer isso?
Saúde
Níger
Solução
sintaxe exata: FORFILES /p d:\new /d -30 /m * /c "cmd /c del @file"
Outras dicas
A maneira mais simples seria um arquivo de execução .bat executado semanalmente ou mensalmente.
cd \mylog\dir
mkdir archive
del /Q .\archive\*.log
move *.log .\archive
Se você quiser algo mais complexo, baixe as ferramentas cygwin para usar comandos do tipo un*x ou, possivelmente, dê uma olhada no Powershell.
Com VBScript, adaptado de Respostas de script
Dim fso, startFolder, OlderThanDate
Set fso = CreateObject("Scripting.FileSystemObject")
startFolder = "E:\temp" ' folder to start deleting (subfolders will also be cleaned)
OlderThanDate = DateAdd("d", -07, Date) ' 07 days (adjust as necessary)
DeleteOldFiles startFolder, OlderThanDate
Function DeleteOldFiles(folderName, BeforeDate)
Dim folder, file, fileCollection, folderCollection, subFolder
Set folder = fso.GetFolder(folderName)
Set fileCollection = folder.Files
For Each file In fileCollection
If file.DateLastModified < BeforeDate Then
' fso.DeleteFile(file.Path) # Modify this to delete after testing
WScript.StdOut.WriteLine (file.Path)
End If
Next
Set folderCollection = folder.SubFolders
For Each subFolder In folderCollection
DeleteOldFiles subFolder.Path, BeforeDate
Next
End Function
Você pode executar este script com CScript
@Jasão:bom utilitário, FORFILES do Resource Kit
Agende um arquivo em lote para lidar com isso.
Esta linha excluirá todos os arquivos (*.*) em c:\mydirectory com mais de 14 dias:
FORFILES -pc:\mydirectory -s -m*.* -d-14 -c"DEL @FILE"
Coloque isso em um arquivo de texto, renomeie-o para algo como "deletefiles.bat" e agende-o.
Eu não testei isso, mas deve ser fácil de tentar.
EDITAR:Se você usar isso, certifique-se de entender o que está acontecendo - o sinalizador -s informa para recorrer aos subdiretórios, e isso pode não ser o que você deseja que aconteça.Além disso, pode ser necessário especificar alguns sinalizadores para o comando DEL.:)
EDITAR:Percebi que você precisa baixar coisas da Microsoft para que FORFILES funcione.Também gosto da solução aceita, pois não precisa ter nada de especial.O único problema é que isso só acontece a cada duas semanas, em vez de executar um processo diariamente para remover todas as coisas com mais de 14 dias.Pelo que isso vale.:P
Por que você não escreve um arquivo em lote ou um script do PowerShell e o agenda?
Roteiro para excluir arquivos anteriores a uma data especificada.
É bastante trivial se você tiver um perl (ou similar) instalado no servidor:
#!perl
foreach my $file (</path/to/logs/*.log>) {
next unless -M $file > 14;
print "Deleting $file...\n";
# unlink $file or die "Failed to remove $file: $!";
}
A linha que realmente faz a exclusão está comentada, pois pode haver crianças na casa :)