Comparer contenus de dossier, et modifier nom de fichiers

Résolu
nicolas.74 -  
 nicolas.74 -
Bonjour,
je cherche à faire un script en Batch pour comparer le contenu de 2 dossier, si des fichiers sont existant dans les deux dossier les supprimer dans le premier dossier, et si 2 fichiers ne sont pas identiques mais ont les mêmes noms alors modifier le nom dans le dossier 2 et rajouter la date.
Mais je trouve absolument rien, quelqu'un arriverait à m'aider?

Merci,
Nicolas

6 réponses

Résumé de la discussion

Un script Batch vise à comparer le contenu de deux dossiers, supprimer dans le premier les fichiers présents et renommer ceux du second en ajoutant la date lorsque les noms coïncident.
Plusieurs propositions utilisent des boucles FOR et dir pour lister les fichiers, puis comparent les noms et contenus via outils comme comp ou findstr afin d'enregistrer les suppressions et les renommages.
Certaines discussions insistent sur l'ordre des actions: l'impact du renommage dans le second dossier avant toute copie vers le dossier old et les risques de duplication.
En cas de corrections, les contributeurs proposent des ajustements sur la gestion des fichiers à copier vers old et sur l'inclusion exacte de la date dans les noms, afin d'éviter des remaniements.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Slt

    @echo off

    set dossier1=%USERPROFILE%\Tests1
    set dossier2=%USERPROFILE%\Tests2

    if not exist "%dossier1%" goto :eof
    if not exist "%dossier2%" goto :eof

    set liste1=%USERPROFILE%\efface.txt
    set liste2=%USERPROFILE%\renomme.txt

    if exist "%liste1%" (del "%liste1%")
    if exist "%liste2%" (del "%liste2%")

    for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.*"') do (

    for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.*"') do (

    if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)

    if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)

    )
    )

    cls

    if not exist "%USERPROFILE%\efface.txt" goto suite
    cd %dossier1%

    for /f "tokens=*" %%C in (%liste1%) do (del "%%C" && echo Suppression de : %dossier1%\%%C)

    :suite
    if not exist "%USERPROFILE%\renomme.txt" goto fin
    cd %dossier2% & echo.

    for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%%date:~3,2%%date:~0,2%%%~xD" && echo Renommage de : %dossier2%\%%D)

    :fin

    echo. & pause

    exit
    1
    1. nicolas.74
       
      Tooooooooooooooooooooooooop merci ! Je l'ai adapté un peu pour que ça corresponde à ma situation, et tout à l'air de fonctionner, tu me sauves la vie !

      Voilà mon code final:

      @echo off

      if exist C:\Users\thibaxav\Desktop\script\temp\ rmdir /s /q C:\Users\thibaxav\Desktop\script\temp\
      MD C:\Users\thibaxav\Desktop\script\temp\
      For /f "tokens=*" %%a In ('dir /s /b /a-d "C:\Users\thibaxav\Desktop\script\source\*_IT.docx"') Do (Xcopy "%%a" "C:\Users\thibaxav\Desktop\script\temp")

      set dossier1=C:\Users\thibaxav\Desktop\script\temp
      set dossier2=C:\Users\thibaxav\Desktop\script\dossierfinalavectouslesfichiers

      set liste1=%USERPROFILE%\efface.txt
      set liste2=%USERPROFILE%\renomme.txt

      if exist "%liste1%" (del "%liste1%")
      if exist "%liste2%" (del "%liste2%")

      for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.*"') do (

      for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.*"') do (

      if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)
      if /i "%%~nxA"=="%%~nxB" (echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)

      )
      )

      cls

      if not exist "%USERPROFILE%\efface.txt" goto suite
      cd %dossier2%
      for /f "tokens=*" %%C in (%liste1%) do (del "%%C" && echo Suppression de : %%C dans %dossier2%)

      :suite
      if not exist "%USERPROFILE%\renomme.txt" goto fin
      cd %dossier1% & echo.
      for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%.%date:~3,2%.%date:~0,2%%%~xD" && echo Renommage de : %%D dans %dossier1%)

      :fin
      For /f "tokens=*" %%a In ('dir /s /b /a-d "C:\Users\thibaxav\Desktop\script\temp\*.docx"') Do (Xcopy "%%a" "C:\Users\thibaxav\Desktop\script\dossierfinalavectouslesfichiers")
      cd C:\Users\thibaxav\Desktop\script\
      rmdir /s /q C:\Users\thibaxav\Desktop\script\temp\
      del %USERPROFILE%\renomme.txt
      del %USERPROFILE%\efface.txt
      exit
      0
  2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    Voilà le script avec la suite :

    @echo off

    set dossier1=%USERPROFILE%\Desktop\script\temp
    set dossier2=%USERPROFILE%\Desktop\script\dossierfinal
    set dossier3=%USERPROFILE%\Desktop\script\Old

    if exist "%dossier1%" rmdir /S /Q "%dossier1%"

    if not exist "%dossier1%" mkdir "%dossier1%"
    if not exist "%dossier2%" mkdir "%dossier2%"
    if not exist "%dossier3%" mkdir "%dossier3%"

    For /f "tokens=*" %%a In ('dir /s /b /a-d "%USERPROFILE%\Desktop\script\source\*_IT.docx"') Do (Xcopy "%%a" "%dossier1%")

    set liste1=%USERPROFILE%\efface.txt
    set liste2=%USERPROFILE%\renomme.txt

    if exist "%liste1%" (del /F "%liste1%")
    if exist "%liste2%" (del /F "%liste2%")

    for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.*"') do (

    for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.*"') do (

    for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

    if not exist "%dossier1%\%%~nxB" (copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nB_%%G-%%F-%%E%%~xB" > nul && echo Copie de : %dossier2%\%%~nxB)

    )

    if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)

    if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)

    )
    )

    cls

    if not exist "%liste1%" goto suite
    cd %dossier1%
    for /f "tokens=*" %%C in (%liste1%) do (del /F "%%C" && echo Suppression de : %dossier1%\%%C)

    :suite
    if not exist "%liste2%" goto fin
    cd %dossier2% & echo.
    for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%-%date:~3,2%-%date:~0,2%%%~xD" && echo Renommage de : %dossier2%\%%D)

    :fin
    For /f "tokens=*" %%a In ('dir /s /b /a-d "%dossier1%\*.docx"') Do (Xcopy "%%a" "%dossier2%")

    echo. & pause

    del /F "%liste1%"
    del /F "%liste2%"

    exit

    J'ai également intégré tes modifications, j'espère que ça te convient.
    1
    1. nicolas.74
       
      J'ai pas l'impression que ça fonctionne ou alors je fais quelque chose de mal dans mes dossiers, mais j'ai l'erreur "La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte"
      0
    2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > nicolas.74
       
      Tu as peut-être mal copié-collé, ou bien tu as enlevé ou rajouté un espace quelque part, ou tu as oublié un ".

      Pas le temps ce matin, je re-vérifierai le script cet après-midi.
      0
    3. nicolas.74
       
      Pas de soucis c'est déjà super sympa de m'aider !
      Bon en fait la problème vient pas des comparaisons mais de la nouvelle étape, je crois qu'il manque une ligne pour rename les fichiers, du coup il arrive pas à les copier
      0
    4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > nicolas.74
       
      Dans la nouvelle étape la commande copy renomme les fichiers en même temps qu'elle les copie, je suis sûr de cette partie que j'ai testé et re-testé hier.

      Les seules choses que je n'ai pas testé c'est tes modifications, les 2 boucles FOR, que j'ai intégré au début et à la fin du script, sinon le reste c'est ok.
      0
    5. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Vérifie que tu as bien laissé un espace après le slash à droite dans cette commande :

      for /f "tokens=1,2,3,* delims=/ " %%E in
      0
  3. nicolas.74
     
    Bon, bah c'est pas fini, j'ai besoin d'aide pour la suite, lorsque un fichier n'existe plus dans la source mais existe dans le dossier de destination, il faudrait que le fichier soit copié dans un dossier "old" avec si possible le nom de dernière modification.

    J'essaye des trucs mais j'arrive pas à faire quelque chose qui marche, j'ai l'impression de tourner autours du vrai but.
    Quelqu'un arriverait à m'aider?

    Nicolas
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Qu'est-ce que tu appelles le nom de dernière modification ?

      Donne un exemple.
      0
    2. nicolas.74
       
      Je me suis mal exprimé désolé, je voulais dire rajouter au nom la dernière date de modification.
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Cette étape est à faire avant le reste du script alors ?

      Parce que sinon les fichiers renommés avec la date du jour vont se retrouver avec une deuxième date en plus de la première.
      0
    4. nicolas.74
       
      Désolé de la réponse tardive, non ça ne va pas mettre deux fois le nom, parce que les fichiers qui sont rename avec la date du jour sont dans les deux répertoires, alors que maintenant il faut rename les fichiers qui ne sont que dans le répertoire 2 donc aucun risque de double rename, mais l'ordre n'a pas beaucoup d'importance
      0
    5. nicolas.74
       
      je corrige ce que j'ai dit, l'ordre a bien une importance, parce que si on fait cette copie des fichiers "old" à la fin, les fichiers renommés précédemment(avec la date du jour) vont aussi être copié puisqu'ils n'existent pas avec ce nom dans le dossier temp
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    J'ai bien re-testé en profondeur, il n'y a pas de problème majeur :

    @echo off

    set dossier1=%USERPROFILE%\Desktop\script\temp
    set dossier2=%USERPROFILE%\Desktop\script\dossierfinal
    set dossier3=%USERPROFILE%\Desktop\script\dossierfinal\old

    if exist "%dossier1%" rmdir /S /Q "%dossier1%"

    if not exist "%dossier1%" mkdir "%dossier1%"
    if not exist "%dossier2%" mkdir "%dossier2%"
    if not exist "%dossier3%" mkdir "%dossier3%"

    For /f "tokens=*" %%a In ('dir /s /b /a-d "%USERPROFILE%\Desktop\script\source\*_IT.docx"') Do (Xcopy "%%a" "%dossier1%\")

    set liste1=%USERPROFILE%\efface.txt
    set liste2=%USERPROFILE%\renomme.txt

    if exist "%liste1%" (del /F "%liste1%")
    if exist "%liste2%" (del /F "%liste2%")

    for /f "tokens=*" %%A in ('dir /b /a-d "%dossier1%\*.docx"') do (
    for /f "tokens=*" %%B in ('dir /b /a-d "%dossier2%\*.docx"') do (

    for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

    if not exist "%dossier1%\%%~nxB" (copy /V "%dossier2%\%%~nxB" "%dossier3%\%%~nB_%%G-%%F-%%E%%~xB" > nul && echo Copie de : %dossier2%\%%~nxB)
    )

    if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" && echo %%~nxA >> %liste1%)

    if /i "%%~nxA"=="%%~nxB" (echo. & echo N | comp "%dossier1%\%%~nxA" "%dossier2%\%%~nxB" | findstr /C:"OK" || echo %%~nxB >> %liste2%)
    )
    )

    if not exist "%liste1%" goto suite
    cd %dossier1%
    for /f "tokens=*" %%C in (%liste1%) do (del /F "%%C" && echo Suppression de : %dossier1%\%%C)

    :suite
    if not exist "%liste2%" goto fin
    cd %dossier2%
    for /f "tokens=*" %%D in (%liste2%) do (ren "%%D" "%%~nD_%date:~6,4%-%date:~3,2%-%date:~0,2%%%~xD" && echo Renommage de : %dossier2%\%%D)

    :fin
    For /f "tokens=*" %%a In ('dir /b /a-d "%dossier1%\*.docx"') Do (Xcopy "%%a" "%dossier2%\")

    cd %USERPROFILE%\Desktop\script\
    rmdir /S /Q "%dossier1%"

    del /F "%liste1%"
    del /F "%liste2%"

    exit

    Juste un petit détail à corriger dans la nouvelle étape mais ça n'est pas gênant.

    A quoi sert ton cd à la fin ?
    0
    1. nicolas.74
       
      Bon de plus en plus bizarre, avec ton dernier script, si il y a aucun fichier dans la destination ( %dossier2% ) aucune copie ne se fait, mais si il y a juste un seul fichier qui est égal au dossier temp la copie se fait bien

      Mais pourtant ça marche avec la dernière version que j'ai posté.
      Mais outre ce problème la copie dans old ne se fait toujours pas


      De plus en plus bizarre ce script, il faudrait que j'essaye sur un autre PC
      0
    2. nicolas.74
       
      Sinon c'est possible de le faire en 2 commandes différentes? Parce que j'ai essayé en modifiant la ligne mais ça marche pas
      if not exist "%dossier1%\%%~nxB" (copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nxB" && rename %dossier3%\%%~nxB %%~nB_%%G-%%F-%%E%%~xB )



      Et j'avais pas vu la question, le dossier ne se supprimait pas sans cd et en cherchant sur internet j'ai vu quelqu'un dire qu'il fallait mettre un cd avant, je l'ai mit et depuis ça marche
      0
    3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      avec ton dernier script, si il y a aucun fichier dans la destination ( %dossier2% ) aucune copie ne se fait

      ==>> c'est un comportement normal puisqu'il n'y a rien à comparer

      Pourtant c'est exactement ce qui est demandé :

      1) si 2 fichiers ont le même nom et la même taille : supprimer celui du dossier1

      2) si 2 fichiers ont le même nom mais pas la même taille : renommer celui du dossier2

      3) si le fichier est présent dans dossier2 mais pas dans dossier1 : le copier dans dossier3
      0
    4. nicolas.74 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Ah oui je comprends, je pensais pas que ça marchait comme ça
      0
    5. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > nicolas.74
       
      Au début j'avais fait en 2 commandes comme toi au-dessus mais impossible à faire fonctionner, ensuite j'ai compris que je pouvais copier et renommer en une seule commande et ça a marché.
      0
  6. nicolas.74
     
    Bonjour,
    Je reviens à vous une dernière fois, j'aime bien comprendre ce que je fais, quelqu'un arriverait à m'expliquer ce que cette commande fait ?
    for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

    Parce que j'ai beau la décortiquer dans tous les sens j'arrive pas à comprendre

    Merci d'avance,
    Nicolas
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Salut, cette commande a pour but de récupérer la date de modification d'un fichier, la commande dir permet de lister le fichier ainsi que sa date de modification, ensuite le findstr sert à supprimer les lignes superflues générées par la commande dir pour ne garder que la ligne qui contient la date, ensuite le for récupère et décompose la date en 3 parties (jour, mois, année)
      0
    2. nicolas.74
       
      D'accord top merci ! J'essayais de décomposer les commande une à une mais il fallait les tourner un peu pour comprendre, top merci beaucoup !



      Si un modo passe par là il peut mettre le sujet en résolu? J'ai changé de PC du coup j'ai plus accès au bouton pour le mettre en résolu
      0