CMD di Windows trova i file duplicati tra due unità disco


3

Ho due dischi, diciamo driveA (F :) e driveB (G :). Una volta ho copiato tutto il contenuto di DriveB in DriveA. Ma dopo che l'unitàB ha aggiunto nuovi file e cartelle. Vorrei eliminare i file duplicati e le cartelle da DriveB e lasciare solo quelli che non esistono in driveA.

Ho provato il comando qui sotto solo per verificare se i duplicati sono stati trovati ma non funziona come volevo perché ha il percorso completo nella variabile %%a. Certo, l'output che ora ha echo %%a sarà sostituito con a DEL equivalente nel caso in cui funzioni.

@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 rimuovo il /s passare dal dir comando funziona perché il %%a ha solo il nome del file invece del percorso completo ma non funziona in modo ricorsivo per le sottocartelle, quindi non è così utile.

Risposte:


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

Spiegazione:

  • /A:-D per escludere le directory (cartelle) dall'elenco come successivo del comando cancellerebbe file invece di directory (come da del /?: Se viene specificata una directory, tutti i file all'interno della directory verranno eliminati, ma la cartella stessa non verrà rimossa);
  • Trattare le cartelle a parte: usarne un'altra for /F contro dir con /A:D passare ma in questo caso utilizzare rd invece di del comando a cancella una cartella ; uso rd /S rimuovere un intero albero di cartelle (tutti i file e le sottocartelle oltre alla cartella stessa).
  • %%~pnxa espande %%a al massimo percorso + nome + estensione compreso un leader \ (no G: specifiche del disco);
  • del "%%~a" doppio percorso completo citato per trattare correttamente i percorsi con gli spazi;
  • io raccomando "delims=" invece di "tokens=*" trattare i possibili spazi iniziali nei nomi dei file in modo corretto (questo potrebbe prendere posto con no /S bandiera);
  • considerare ulteriori opzioni della riga di comando (vedi del /? e rd /? ).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.