3 votes

Windows CMD recherche les fichiers en double entre deux lecteurs de disque

J'ai deux lecteurs, disons le lecteur A (F :) et le lecteur B (G :). J'avais déjà copié tout le contenu du lecteur B dans le lecteur A. Mais après que le lecteurB a quelques nouveaux fichiers et dossiers ajoutés à elle. J'aimerais supprimer les fichiers et dossiers en double du lecteur B et ne laisser que ceux qui n'existent pas sur le lecteur A.

J'ai essayé la commande ci-dessous juste pour vérifier si les doublons sont trouvés mais cela ne fonctionne pas comme je le voulais car il y a le chemin complet dans la variable. %%a . Bien sûr, la sortie qui a maintenant echo %%a sera remplacé par un DEL équivalent au cas où cela fonctionnerait.

@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

Si je retire le /s passer de la dir cela fonctionne car la commande %%a n'a que le nom du fichier au lieu du chemin complet, mais il ne fonctionne pas de manière récursive pour les sous-dossiers, il n'est donc pas très utile.

1voto

JosefZ Points 11907
@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

Explication :

  • /A:-D pour exclure des répertoires (dossiers) de la liste en tant qu'ultérieurs del supprimerait les fichiers au lieu des répertoires (comme dans la commande del /? : Si un répertoire est spécifié, tous les fichiers du répertoire seront supprimés, mais le dossier lui-même ne sera pas supprimé) ;
  • traiter les dossiers à part : utiliser un autre for /F contre dir con /A:D mais dans ce cas, utilisez rd au lieu de del pour supprimer un dossier ; utiliser rd /S pour supprimer l'arborescence entière d'un dossier (tous les fichiers et sous-dossiers en plus du dossier lui-même).
  • %%~pnxa s'étend %%a à plein chemin + nom + extension dont un leader \ (non G: spécification du disque) ;
  • del "%%~a" chemin complet entre guillemets pour traiter correctement les chemins avec des espaces ;
  • Je recommande "delims=" au lieu de "tokens=*" pour traiter correctement les éventuels espaces de tête dans les noms de fichiers (cela pourrait se faire en l'absence de /S drapeau) ;
  • envisager des commutateurs de ligne de commande supplémentaires (voir del /? y rd /? ).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X