Ir ao conteúdo
  • Cadastre-se

Bat Bat para deletar arquivos com nome similar


Ir à solução Resolvido por ricardo_br,

Posts recomendados

Boa tarde pessoal, 

Preciso de uma ajuda para desenvolver uma bat que apague os arquivos com nome "parecido" em uma pasta. Os nomes sao iguais, mas no final seta a data/horario por isso ficam com essa diferença.

por exemplo na pasta possuo os arquivos: 

 

Existem varios invoices esses sao apenas exemplos.

ORACLECLOUD_AP_PREVISTO_INVOICE_ID#762514DISTRIB#1238556PARCELA#1_2023_9_7_3_22_45_558_98
ORACLECLOUD_AP_PREVISTO_INVOICE_ID#762514DISTRIB#1238556PARCELA#1_2023_9_7_3_32_56_33_161.inb
ORACLECLOUD_AP_PREVISTO_INVOICE_ID#781103DISTRIB#300000769989625PARCELA#1_2023_9_6_21_41_58_222_852.inb
ORACLECLOUD_AP_PREVISTO_INVOICE_ID#781103DISTRIB#300000769989625PARCELA#1_2023_9_6_21_52_14_601_949.inb

Eu tentei fazer desta maneira, mas desse jeito apagam todos e não mantem um de cada desses registros.

 

@echo off
setlocal enabledelayedexpansion

set "last="
for /f "tokens=*" %%a in ('dir /b /a-d *') do (
    set "name=%%~na"
    if "!name:%last%=!" equ "!name!" (
        set "last=!name!"
    ) else (
        echo Excluindo %%a
        del /q "%%a"
    )
)

 

Link para o comentário
Compartilhar em outros sites

@ricardo_br isso na verdade eu quero que mantenha 1 só de cada...

Por exemplo, um arquivo chama ABC_18_05, o outro chama ABC_18_06. O conteudo dos dois é o mesmo o que mudou foi o horario setado no final, para mim não importa qual dos dois irá permanecer, mas preciso que fique apenas 1 de cada.

1 arquivo ABC 1 não importa o horario do fim....
1 arquivo DEF e por ai vai...

Link para o comentário
Compartilhar em outros sites

@ricardo_br Seguem alguns exemplos...

preciso que fique apenas 1 arquivo de cada um desses invoices, anexei 3 de cada, mas existem muitos mais.

ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#794988DISTRIB#1629771PARCELA#1_2023_9_5_23_2_40_914_776.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#794988DISTRIB#1629771PARCELA#1_2023_9_5_23_41_46_274_689.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#794988DISTRIB#1629771PARCELA#1_2023_9_6_0_1_31_973_474.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#798541DISTRIB#1307705PARCELA#1_2023_9_15_5_13_8_606_203.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#798541DISTRIB#1307705PARCELA#1_2023_9_15_5_3_2_3_100.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#798541DISTRIB#1307705PARCELA#1_2023_9_15_6_23_47_108_508.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#798541DISTRIB#1307708PARCELA#1_2023_9_15_7_25_53_70_983.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#798541DISTRIB#1307708PARCELA#1_2023_9_15_7_46_52_567_658.inb
ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#798541DISTRIB#1307708PARCELA#1_2023_9_15_7_5_23_129_565.inb

Link para o comentário
Compartilhar em outros sites

@Attilio Brandi Esse bat que eu fiz não olha pelo nome ele olha pelo tamanho e pelo hash do arquivo. O hash do arquivo é um código único que só aquele arquivo tem e todas as suas cópias tem o mesmo hash. Ele funciona como aqueles pesquisadores de arquivos duplicados, só que ele apaga os arquivos duplicados.

Teste em uma cópia antes para não ter surpresas desagradáveis. Você pode arrastar a pasta onde estão os arquivos para o bat ou informar o caminho....

 

Pesquisar-duplicata.gif

 

@echo off

chcp 1252 >nul
:Inicio
if exist "%~1\" (set "Fonte=%~1") else (set /p "Fonte=Fonte: ")

if not exist "%Fonte%" goto :Inicio

>"%~dp0resultado.log" echo Arquivos Apagados:
>>"%~dp0resultado.log" echo ------------------
>>"%~dp0resultado.log" echo.

pushd "%Fonte%"
for /f "delims=" %%a in ('dir /a /s /b *.inb') do for /f "delims=" %%b in ('dir /b /s /a *.inb') do if [%%~za]==[%%~zb] if not [%%~fa]==[%%~fb] call :Verifica "%%~a" "%%~b"

popd
exit

:Verifica
for /f "skip=1 delims=" %%a in ('certutil -hashfile "%~1" MD5') do (
                                                                    set Hash1=%%a
                                                                    goto :prox1
                                                                   )
:prox1
for /f "skip=1 delims=" %%a in ('certutil -hashfile "%~2" MD5') do (
                                                                    set Hash2=%%a
                                                                    goto :prox2
                                                                   )
:prox2
if /i "%Hash1%"=="%Hash2%" (
                            >>"%~dp0resultado.log" echo "%~f2"
                            del /q /a "%~f2"
                           )
goto :EOF

 

Link para o comentário
Compartilhar em outros sites

@ricardo_br Bom dia, testei aqui, mas infelizmente ainda não deu certo. Separei um grupo de 100 arquivos para testar, ficou + ou - 20 min rodando, mas não apagou nenhum registro.

Veja na pasta Teste a maioria dos arquivos estava com o nome ORACLECLOUD_AP_REAL_INVOICE_PAYMENT_ID#799555DISTRIB#300000881058350PARCELA#1 Mudando apenas o horario no fim do arquivo.

image.thumb.png.aee6294f91b92007a2b2b90f1cb4de73.pngimage.thumb.png.b13786afe49e1d8c016ba66012e6e609.png

Link para o comentário
Compartilhar em outros sites

@ricardo_br Estou utilizando esse aqui, que move da pasta Bkp para a que preciso que faça a leitura, mas estou dando prioridade para os arquivos com o nome AP_Real pois sao mais urgentes.
Segue o codigo

@echo off
setlocal enabledelayedexpansion

set origem=caminhoOrigem\bkp\
set destino=caminhoDestino\
set contador=0
set limite=3000

for %%F in ("%origem%\ORACLECLOUD_AP_REAL_*.*") do (
    set /a contador+=1
    move "%%F" "%destino%"
    
    if !contador! equ !limite! (
        set contador=0
        goto :wait
    )
)

:wait
timeout /t 5 /nobreak >nul

endlocal

 

Link para o comentário
Compartilhar em outros sites

  • Solução

Aqui está, apaga por nome parecido, mais ao invés de deletar eu preferia mover os arquivos para algum lugar por exemplo a pasta %temp% ai ainda tem como pegar de volta se apagar algum por engano.

 

Teste em cópias antes....

 

@echo off

if exist "%~1" (if exist "%~1\" (set "Fonte=%~1")) else (set /p "Fonte=Fonte: ")

pushd "%Fonte%"
for /f "delims=" %%a in ('dir /s /b /a *.inb') do (
                                                   set Var=%%~nxa
                                                   set Contador=0
                                                   call :Pesquisar "%%~dpa" "%%~fa"
                                                  )

exit

:Pesquisar
if not "%Var:~-1%"=="#" (
                         set "Var=%Var:~0,-1%"
                         goto :Pesquisar
                        )

for /f "skip=1 delims=" %%a in ('dir /b /a-d "%~1*%Var%*"') do del /q "%~1%%a"

goto :EOF

 

Link para o comentário
Compartilhar em outros sites

@ricardo_br @ricardo_br Deu certo, Muito obrigado, só esta demorando devido ao volume de arquivos, mas deixei rolando aqui. não tem problema se apagar algum por engano, eu consigo reprocessar e gerar novamente, é que não compensava excluir todos os invoices e mandar tudo de novo, porque podia acontecer a mesma coisa de cair varias vezes o mesmo.

Mas deixei rodando aqui, muito obrigado pela força.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!