Comparar contenido de la carpeta y modificar el nombre de los archivos

Resuelto
nicolas.74 -  
 nicolas.74 -
Hola,
busco hacer un script en Batch para comparar el contenido de 2 carpetas, si archivos existen en ambas carpetas los elimino en la primera carpeta, y si 2 archivos no son idénticos pero tienen los mismos nombres entonces modifico el nombre en la carpeta 2 y añado la fecha.
Pero no encuentro absolutamente nada, ¿alguien podría ayudarme?

Gracias,
Nicolás

6 respuestas

  1. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
     
    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
       
      ¡Muchísimas gracias! Lo adapté un poco para que encaje con mi situación, y todo parece funcionar, ¡me salvas la vida!
      Aquí está mi código 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 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
     
    Aquí está el script con la continuación:

    @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
       
      No tengo la impresión de que funcione, o tal vez estoy haciendo algo mal en mis carpetas, pero me aparece el error "La sintaxis del nombre de archivo, del directorio o del volumen es incorrecta".
      0
    2. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929 > nicolas.74
       
      Puede que lo hayas copiado-pega mal, o que hayas eliminado o añadido un espacio en algún lugar, o que hayas olvidado una "&".

      No tengo tiempo esta mañana, volveré a verificar el guion esta tarde.
      0
    3. nicolas.74
       
      No hay problema, ya es muy amable de ayudarme.
      En realidad, el problema no viene de las comparaciones, sino de la nueva etapa; creo que falta una línea para renombrar los archivos, así que no puede copiarlos.
      0
    4. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929 > nicolas.74
       
      En la nueva etapa, la orden copy renombra los archivos al mismo tiempo que los copia, estoy seguro de esa parte porque la probé y la volví a probar ayer.

      Las únicas cosas que no he probado son tus modificaciones, los 2 bucles FOR, que los integré al inicio y al final del script, de lo contrario el resto está bien.
      0
    5. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
       
      for /f "tokens=1,2,3,* delims=/" %%E in
      0
  3. nicolas.74
     
    Bueno, pues no está terminado, necesito ayuda para la continuación: cuando un archivo ya no existe en la fuente pero sí existe en la carpeta de destino, habría que copiar el archivo a una carpeta "old" y, si es posible, con el nombre de la última modificación.

    Estoy probando cosas pero no consigo hacer que funcione, tengo la impresión de dar vueltas alrededor del verdadero objetivo.
    ¿Alguien podría ayudarme?

    Nicolas
    0
    1. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
       
      ¿Qué llamas el nombre de la última modificación?

      Da un ejemplo.
      0
    2. nicolas.74
       
      Lo siento, me expresé mal: quería decir añadir al nombre la última fecha de modificación.
      0
    3. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
       
      ¿Este paso se debe hacer antes del resto del script?

      Porque si no, los archivos renombrados con la fecha del día van a terminar con una segunda fecha además de la primera.
      0
    4. nicolas.74
       
      Lo siento por la respuesta tardía, no, no va a colocar dos veces el nombre, porque los archivos que se renombran con la fecha del día están en los dos directorios, mientras que ahora hay que renombrar únicamente los archivos que están solo en el directorio 2, así que no hay riesgo de renombrar dos veces, pero el orden no tiene mucha importancia.
      0
    5. nicolas.74
       
      corrijo lo que dije, el orden tiene importancia, porque si al final hacemos esta copia de los archivos "old", los archivos renombrados previamente (con la fecha del día) también se copiarán, ya que no existen con ese nombre en la carpeta temporal.
      0
  4. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
     
    ¿Para qué sirve tu cd al final?
    0
    1. nicolas.74
       
      Cada vez más extraño, con tu último script, si no hay ningún archivo en el destino (%dossier2%), no se realiza ninguna copia, pero si hay solo un archivo que es igual a la carpeta temp, se realiza la copia correctamente.

      Pero aun así funciona con la última versión que publiqué.
      Pero aparte de ese problema, la copia en old sigue sin hacerse.


      Cada vez más extraño este script; debería intentar en otro PC.
      0
    2. nicolas.74
       
      ¿Es posible hacerlo en 2 comandos diferentes? Porque intenté modificando la línea pero no funciona
      if not exist "%dossier1%\%%~nxB" (copy /V /Y "%dossier2%\%%~nxB" "%dossier3%\%%~nxB" && rename %dossier3%\%%~nxB %%~nB_%%G-%%F-%%E%%~xB )



      Y no había visto la pregunta, la carpeta no se eliminaba sin cambiar al directorio y buscando en internet vi que alguien decía que hacía falta poner un cd antes, lo hice y desde entonces funciona
      0
    3. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
       
      con tu último script, si no hay ningún archivo en el destino (%dossier2%), no se realiza ninguna copia

      ==>> es un comportamiento normal porque no hay nada que comparar

      Sin embargo, es exactamente lo que se pide:

      1) si dos archivos tienen el mismo nombre y el mismo tamaño: eliminar el del dossier1

      2) si dos archivos tienen el mismo nombre pero no el mismo tamaño: renombrar el del dossier2

      3) si el archivo está presente en dossier2 pero no en dossier1: copiarlo al dossier3
      0
    4. nicolas.74 > barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención  
       
      Ah sí, lo entiendo, no pensé que funcionara así.
      0
    5. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929 > nicolas.74
       
      Al principio lo hice en 2 comandos como tú arriba, pero fue imposible hacerlo funcionar; luego entendí que podía copiar y renombrar en un solo comando y funcionó.
      0
  5. nicolas.74
     
    Hola,
    Vuelvo a ustedes una última vez, me gusta entender lo que hago, ¿alguien podría explicarme qué hace este comando?
    for /f "tokens=1,2,3,* delims=/ " %%E in ('dir "%dossier2%\%%~nxB" ^| findstr /V "volume pertoire octets"') do (

    Porque aunque lo desmenuzo de todas las formas, no logro entenderlo

    Gracias de antemano,
    Nicolas
    0
    1. barnabe0057 Mensajes publicados 14329 Fecha de registro   Estado Colaborador Última intervención   4 929
       
      Hola, este comando tiene como objetivo obtener la fecha de modificación de un archivo. El comando dir sirve para listar el archivo junto con su fecha de modificación, luego findstr se usa para eliminar las líneas innecesarias generadas por el comando dir y quedarse solo con la línea que contiene la fecha, luego for recupera y descompone la fecha en 3 partes (día, mes, año).
      0
    2. nicolas.74
       
      De acuerdo, gracias! Intentaba descomponer los comandos uno por uno, pero había que darlos vuelta un poco para entender; ¡muchas gracias!



      Si pasa algún moderador por aquí, ¿puede marcar el tema como resuelto? Cambié de PC y ya no tengo acceso al botón para marcarlo como resuelto.
      0