O Windows CMD encontra arquivos duplicados entre duas unidades de disco

O Windows CMD encontra arquivos duplicados entre duas unidades de disco

Eu tenho duas unidades, digamos driveA (F:) e driveB (G :). Certa vez, copiei todo o conteúdo do driveB para o driveA. Mas depois disso, o driveB tem alguns novos arquivos e pastas adicionados a ele. Gostaria de excluir os arquivos e pastas duplicados do driveB e deixar apenas aqueles que não existem no driveA.

Eu tentei o comando abaixo apenas para verificar se as duplicatas foram encontradas, mas não funciona como eu queria porque tem o caminho completo na variável %%a. Claro, a saída que agora existe echo %%aserá substituída por uma DELequivalente caso funcione.

@echo off
for /F "tokens=*" %%a in ('dir G:\*.* /b /s') do if not exist "F:\%%a" echo %%a >> C:\Users\billy\Desktop\files.txt
pause

Se eu remover a /sopção do dircomando, ele funcionará porque %%apossui apenas o nome do arquivo em vez do caminho completo, mas não está funcionando recursivamente para as subpastas, portanto não é tão útil.

Responder1

@echo off
for /F "delims=" %%a in ('
  dir G:\*.* /b /s /A:-D
  ') do if not exist "F:%%~pnxa" echo del "%%~a" >> C:\Users\billy\Desktop\files.txt
pause

Explicação:

  • /A:-Dexcluir diretórios (pastas) da lista, pois delo comando subsequente excluiria arquivos em vez de diretório (conforme del /?: Se um diretório for especificado, todos os arquivos dentro do diretório serão excluídos, mas a pasta em si não será removida);
  • separar as pastas: use outra for /Fcontra dircom /A:Dswitch, mas neste caso use rdem vez de delcomando paraexcluir uma pasta; use rd /Spara remover uma árvore de pastas inteira (todos os arquivos e subpastas além da própria pasta).
  • %%~pnxaexpande %%apara completocaminho + nome + extensãoincluindo um líder \(sem G:especificação de disco);
  • del "%%~a"caminho completo entre aspas duplas para tratar caminhos com espaços adequadamente;
  • Eu recomendo, "delims="em vez de "tokens=*", tratar adequadamente possíveis espaços iniciais em nomes de arquivos (isso pode ocorrer sem /Ssinalizador);
  • considere opções adicionais de linha de comando (consulte del /?e rd /?).

informação relacionada