Tenho muitos arquivos D:\cert
que quero excluir, mas também quero manter alguns arquivos com texto específico no nome. Como faço para remover todos *.pdf
os arquivos, mas manter *_sign.pdf
todas as subpastas?
20241220cert.pdf
20241220cert_sign.pdf
20241221cert.pdf
20241221cert_sign.pdf
20241222cert.pdf
20241222cert_sign.pdf
Exemplo após executar script delete:
20241220cert_sign.pdf
20241221cert_sign.pdf
20241222cert_sign.pdf
O
IF
comando não entende curingas para correspondência. Em vez disso, você precisa usar substrings para extrair a parte que deseja corresponder. Se você colar o código abaixo em um arquivo.CMD
ou.BAT
, ele deve fazer o que você está pedindo.Recomendo fortemente adicionar ss64.com aos favoritos ; é uma excelente referência para WinBatch , PowerShell , bash no MacOS e bash no Linux .
Embora isso não tenha sido muito difícil de fazer no WinBatch, minha inclinação teria sido fazê-lo no PowerShell, que tem melhor correspondência/manipulação de strings e um pipeline mais capaz, permitindo que fosse feito como uma "linha única":
Get-ChildItem -Recurse *.pdf | Where-Object {$_.Name -NotLike "*_sign*"} | Remove-Item
Não há um comando direto, mas você pode fazê-lo facilmente movendo os que deseja salvar para algum lugar. Execute isso depois de fazer login no diretório onde os arquivos estão. Eu sugeriria executar um comando de cada vez, para garantir que tudo funcione como você espera.
Isto
Observe que se algo der errado ao mover do xtemp,
rmdir
o diretório não será excluído, pois ele não estará vazio.Bem direto no powershell. Tire o -whatif para fazer de verdade.
Você pode testar e ver o resultado para verificar se ele atende às suas expectativas. Simplesmente remova o
echo/
comando, e ele apagará os arquivos listados durante a execução do teste.No PowerShell você pode fazer o mesmo com
-whatif
: