O Windows CMD encontra arquivos duplicados entre duas unidades de disco

3

Eu tenho dois drives, digamos driveA (F :) e driveB (G :). Eu já havia copiado todo o conteúdo da driveB para driveA. Mas depois disso, o driveB tem alguns novos arquivos e pastas adicionados a ele. Eu gostaria de excluir os arquivos duplicados e pastas da unidade B e deixar apenas aqueles que não existem na unidade.

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 . Naturalmente, a saída que agora tem echo %%a será substituída por um DEL equivalente no caso de funcionar.

@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 opção /s do comando dir , isso funciona porque o %%a tem apenas o nome do arquivo em vez do caminho completo, mas não está funcionando recursivamente para as subpastas, por isso não é útil .

    
por Vassilis Barzokas 14.09.2015 / 10:48

1 resposta

1
@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:-D para excluir diretórios (pastas) da lista, pois o comando del subseqüente excluiria os arquivos em vez do diretório (de acordo com del /? : se um diretório for especificado, todos os arquivos do diretório serão excluídos, mas a própria pasta não será removido);
  • trata as pastas à parte: use outra opção for /F em relação a dir com /A:D , mas, neste caso, use o comando rd em vez de del para delete uma pasta ; use rd /S para remover uma árvore de pastas inteira (todos os arquivos e subpastas, além da própria pasta).
  • %%~pnxa expande %%a para o caminho + nome + extensão completos, incluindo um líder \ (no G: de especificação de disco);
  • del "%%~a" double citou o caminho completo para tratar os caminhos com espaços corretamente;
  • Eu recomendo "delims=" em vez de "tokens=*" para tratar possíveis espaços iniciais em nomes de arquivos corretamente (isso pode acontecer sem /S flag);
  • considere opções adicionais de linha de comando (consulte del /? e rd /? ).
por 14.09.2015 / 12:42