Como excluir todos os arquivos que correspondem a um padrão (ou mais antigo que ..), exceto o arquivo mais novo que corresponde ao padrão?

-1

Eu tenho uma tarefa agendada / script em execução que tira um instantâneo de um arquivo a cada 3 horas, mas o arquivo está crescendo e o espaço em disco é limitado, então, a cada semana, quero realizar uma limpeza.

Por enquanto, eu faço isso manualmente, no entanto, espero que essa tarefa possa ser automatizada?

O que eu quero exatamente, eu tenho um diretório que contém isso:

 B:\>dir
 Volume in drive B is BACKUP
 Volume Serial Number is ****-****

 Directory of B:\

2015-03-04  13:04    <DIR>          MEMORYCRASHDUMPS
2015-03-02  23:59        20 484 150 [20150302235959.082]-Logs.rar
2015-03-03  00:00    <DIR>          Logs
2015-03-01  17:59        67 365 888 [20150301180000.085]-users.sqlite3
2015-03-01  22:50        67 480 576 [20150301230000.368]-users.sqlite3
2015-03-02  00:32        67 480 576 [20150302030000.378]-users.sqlite3
2015-03-02  06:22        67 503 104 [20150302080000.352]-users.sqlite3
2015-03-02  12:59        67 605 504 [20150302130000.084]-users.sqlite3
2015-03-02  17:59        67 740 672 [20150302180000.090]-users.sqlite3
2015-03-02  22:59        67 921 920 [20150302230000.418]-users.sqlite3
2015-03-03  02:58        67 960 832 [20150303030000.088]-users.sqlite3
2015-03-03  07:53        67 966 976 [20150303080000.456]-users.sqlite3
2015-03-03  12:59        68 013 056 [20150303130000.082]-users.sqlite3
2015-03-03  17:59        68 153 344 [20150303180000.081]-users.sqlite3
2015-03-03  22:54        68 339 712 [20150303230000.352]-users.sqlite3
2015-03-04  01:40        68 350 976 [20150304030000.090]-users.sqlite3
2015-03-04  07:51        68 367 360 [20150304080000.358]-users.sqlite3
2015-03-04  12:53        68 452 352 [20150304130000.085]-users.sqlite3
2015-03-04  17:58        68 718 592 [20150304180000.083]-users.sqlite3

Eu quero excluir todos os ./*-users.sqlite3 , exceto o mais novo (bônus: exceto os N mais novos).

Existe um prático comando do Windows para isso?

Já verifiquei algumas questões, embora elas cubram apenas a exclusão de arquivos por data / idade ou padrões, elas não fornecem uma maneira de excluir o item mais recente (apenas um determinado nome de arquivo).

    
por Gizmo 04.03.2015 / 22:12

1 resposta

3

Simples - processa uma listagem de diretórios ordenada por data decrescente via FOR / F, e pula as primeiras N linhas. Seus nomes de arquivos já contêm um registro de data e hora que classifica corretamente em ordem cronológica, para que você possa classificar por nome.

O seguinte irá preservar os 3 arquivos mais recentes. Basta modificar o valor de SKIP conforme necessário.

for /f "skip=3 delims=" %F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do @del "%F"

Você pode colocar o acima em um script em lote e parametrizar o valor de pulo.

purgeLog.bat

@echo off
pushd b:\
for /f "skip=%1 delims=" %%F in ('dir /b /a-d /o-n "[*]-users.sqlite3"') do del "%%F"
popd

Para preservar os dois logs mais recentes, você usaria:

purgeLog 2
    
por 05.03.2015 / 00:15