Exclua todos os arquivos com mais de 365 dias, mas exclua certas pastas

2

Editar: Após a resposta do @Mbu, percebi que minha primeira abordagem com números iniciais em pastas como critérios a serem excluídos não é o caminho certo. Decidi usar uma lista fixa de pastas para excluir.

Eu quero excluir alguns arquivos via lote, mas excluir um determinado conjunto de caminhos a serem verificados

Estrutura de exemplo

E:.
|───MyBatchFile.cmd
|
├───yes
│   │   no.doc        | file has wrong extension
│   │   yes.cfg
│   │   yes.dat
│   │   yes.hgr
│   │
│   └───yes
│           yes.cfg
│           yes.dat
│           yes.hgr
│
├───yes
│       yes.cfg
│       no.dat        | file is too new, modified within a year
│       no.hgr        | file is too new, modified within a year
│
|───no1               | folder is on blacklist
|       importantstuff
│
└───no2               | folder is on blacklist
        importantstuff

Os nomes dos arquivos yes e no demonstram quais arquivos devem ser excluídos

O que eu quero

Pesquise todos os arquivos em todas as pastas e subpastas, iniciando na pasta em que o lote é colocado. Se todas as condições a seguir forem verdadeiras, exclua o arquivo

  1. a extensão de arquivo é .cfg, .dat, .hgr ou .txt
  2. O tempo modificado tem mais de 365 dias
  3. O caminho não está na lista negra

O que eu tentei

Com base nisso pergunta , eu tenho:

@echo off
for %%i in (.cfg, .dat, .hdr, .txt) do (
  forfiles /s /m *%%i /d -365 /c "cmd /c del @path"
)
pause

Dois dos três problemas foram resolvidos, mas como excluo um determinado conjunto de pastas.
Como E:\no1 e E:\no2 do meu exemplo.

    
por nixda 08.11.2013 / 11:53

2 respostas

2

Você pode experimentar este script, mas ele só funcionará se %%~tA nas configurações regionais estiver retornando a data do arquivo usando o formato YMD. Caso contrário, a comparação não funcionará como esperado.

@Echo Off
setlocal enabledelayedexpansion

for /r %%A in (*.cfg;*.dat;*.hdr) do (
  set p=%%~pA
  set numeric=no
  if "!p:~1,1!"=="0" set numeric=yes
  if "!p:~1,1!"=="1" set numeric=yes
  if "!p:~1,1!"=="2" set numeric=yes
  if "!p:~1,1!"=="3" set numeric=yes
  if "!p:~1,1!"=="4" set numeric=yes
  if "!p:~1,1!"=="5" set numeric=yes
  if "!p:~1,1!"=="6" set numeric=yes
  if "!p:~1,1!"=="7" set numeric=yes
  if "!p:~1,1!"=="8" set numeric=yes
  if "!p:~1,1!"=="9" set numeric=yes

  if !numeric!==yes (
    if "%%~tA" LSS "2012-11-08" (
      del %%A
    )
  )
)

endlocal

EDITAR

Acho que consegui modificar o script para funcionar do jeito que você deseja. Eu tive que me livrar do /r switch e chamar uma sub-rotina de forma recursiva ou a lista negra não funcionaria corretamente. A lista negra deve ser armazenada no arquivo blacklist.txt no mesmo diretório em que o script reside. O arquivo deve conter caminhos completos para pastas excluídas sem aspas:

D:\excluded folder1
D:\excluded folder2
D:\included folder\excluded folder3

Para cada pasta que não está na lista negra, é chamada uma sub-rotina que pesquisa por arquivos baseados na extensão e, em seguida, a data de cada arquivo é comparada com a data fornecida. Por favor, teste o script completamente. Eu tenho medo que ele possa quebrar em nomes de pastas contendo caracteres especiais como % ou ^ .

@Echo Off
call :browse D:
goto :EOF

:browse
for /d %%A in ("%~1\*") do (
  find /i "%%A" %~dp0blacklist.txt > nul
  if errorlevel 1 (
    call :delete "%%A"
    call :browse "%%A"
  ) else (
    echo SKIP %%A
  )
)
goto :EOF

:delete
for %%A in ("%~1\*.cfg" "%~1\*.dat" "%~1\*.hdr") do (
  if "%%~tA" LSS "2012-10-08" (
    echo DEL  %%A
    del "%%A"
  ) else (
    echo SAVE %%A
  )
)
goto :EOF
    
por 08.11.2013 / 13:12
1

Eu acho que a resposta da MBu é melhor do que a minha, já que ela não depende de uma ferramenta externa como o Robocopy. E se a lista de pastas na lista negra crescer, meu comando Robocopy ficará feio. No entanto, quero compartilhar o que encontrei.

Você pode usar indevidamente Robocopy para excluir arquivos antigos, filtrar por determinadas extensões e excluir vários diretórios da verificação - tudo em um comando.

md C:\TrashMe 
robocopy C:\ C:\TrashMe *.cfg *.hdr *.txt *.dat /MOVE /E /MINAGE:365 /CREATE /R:1 /W:1 /XD C:\dir1 C:\dir2 C:\TrashMe
rd C:\TrashMe

O lote criará uma pasta de lixo temporária chamada TrashMe .
O Robocopy irá então mover (não copiar!) Todos os arquivos desejados (extensão correta e registro de data e hora modificado com mais de 365 dias) para essa pasta de lixo. Você exclui várias pastas com a opção /XD .
A última ação é remover a pasta da lixeira contendo todos os arquivos antigos encontrados.

O truque é usar a opção /CREATE para que o robocopy crie arquivos de zero bytes em vez do arquivo de origem real. Isso acelera a movimentação do comando e a exclusão da peça.

Comando Robocopy em detalhes

  • robocopy chama C: \ Windows \ System32 \ Robocopy.exe que é pré-instalado no Windows Server 2003, Vista, 7 e 8
  • C:\ é a pasta de origem que deve ser verificada
  • C:\TrashMe é a pasta de destino (temporária) de todos os arquivos encontrados
  • *.cfg *.hdr *.txt *.dat são curingas e filtrarão por determinadas extensões de arquivo
  • /MOVE cortará e colará todos os arquivos encontrados em vez de copiá-los e colá-los
  • /E varrerá todos os subdiretórios
  • /MINAGE:365 excluirá todos os arquivos que forem mais recentes que 365 dias
  • /CREATE criará arquivos baseados em zero em vez do arquivo de origem original
  • /R:1 /W:1 é o número de novas tentativas e o tempo de espera entre o bloqueio do arquivo e a exclusão não pode ser
  • /XD C:\dir1 C:\dir2 C:\TrashMe é minha lista de pastas na lista negra. Eu tive que incluir a pasta TrashMe também porque ela é colocada dentro da pasta de origem
por 21.11.2013 / 21:59