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 %%a
será substituída por uma DEL
equivalente 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 /s
opção do dir
comando, ele funcionará porque %%a
possui 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:-D
excluir diretórios (pastas) da lista, poisdel
o comando subsequente excluiria arquivos em vez de diretório (conformedel /?
: 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 /F
contradir
com/A:D
switch, mas neste caso userd
em vez dedel
comando paraexcluir uma pasta; userd /S
para remover uma árvore de pastas inteira (todos os arquivos e subpastas além da própria pasta). %%~pnxa
expande%%a
para completocaminho + nome + extensãoincluindo um líder\
(semG:
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/S
sinalizador); - considere opções adicionais de linha de comando (consulte
del /?
erd /?
).