Comparar contenido de la carpeta y modificar el nombre de los archivos
Resuelto
nicolas.74
-
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
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
-
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-
¡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
-
-
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.-
-
-
-
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. -
-
-
-
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-
-
-
-
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.
-
-
-
¿Para qué sirve tu cd al final?
-
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. -
¿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 -
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 -
-
-
-
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-
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).
-
-