Elimine archivos duplicados según el tamaño del archivo con Windows por lotes

3

Tengo un grupo de archivos en un directorio (con subdirectorios) con nombres similares, excepto que el último dígito es un número diferente. Me gustaría mantener la versión con el tamaño de archivo más grande. Sin embargo, algunos archivos no tendrán ningún duplicado, pero necesito mantener ese archivo.

los archivos se verán como

111~1.mp4    (1mb)
111~2.mp4    (5mb)
111~3.mp4    (2mb)

222~1.mp4    (3mb)

333~1.mp4    (2mb)
333~2.mp4    (4mb)

444~1.mp4    (1mb)
444~2.mp4    (5mb)
444~3.mp4    (3mb)
444~4.mp4    (7mb)

Me gustaría mantener solo el tamaño de versión más grande.

111~2.mp4    (5mb)

222~1.mp4    (3mb)

333~2.mp4    (4mb)

444~4.mp4    (7mb)

Me temo que me quedé perplejo, he estado buscando pero no he podido ponerlo en marcha lo que he hecho hasta ahora es poder obtener el tamaño de los archivos

set "filename=*.*"
for %%A in (%filename%) do echo.Size of "%%A" is %%~zA bytes

pero ahora tengo que comparar los duplicados entre sí y eliminar la versión de menor tamaño y solo conservar la versión de mayor tamaño y si no hay duplicados que mantener esa versión.

Juan Lopez
fuente

Respuestas:

3

Esto debería hacer el trabajo:

@ECHO OFF
SETLOCAL EnableDelayedExpansion



REM **************************************************

REM Source directory
SET source=C:\adjust\path\to\folder

REM Set folder name
SET folder_name=folder

REM **************************************************



REM Creating a new directory to sort out files
IF NOT EXIST "%source% TEMP" MD "%source% TEMP"

REM Sorting out files without duplicates
FOR /F "tokens=1,* delims=~" %%A IN ('DIR /S/B/A-D "%source%"') DO (
    IF NOT EXIST "%%~fA~2%%~xB" COPY "%%~fA~1%%~xB" "%source% TEMP\%%~nxA~1%%~xB" >nul 2>&1
)

REM Sorting out files with biggest size
FOR /F "tokens=1,* delims=~" %%F IN ('DIR /S/B/A-D "%source%"') DO (
    SET path=%%~dpF
    SET name_1=%%~nF~
    FOR /F "delims=" %%A IN ('DIR "%%~fF*" /S/B/O:-S') DO (SET biggest=%%A && CALL :copy)
)

REM Deleting all duplicates
RD /S /Q "%source%"

REM Renaming TEMP to source
REN "%source% TEMP" "%folder_name%"
CLS
ECHO.
ECHO  Done^^!
ECHO.
PAUSE



:copy
SET name_2=%biggest:*~=%
COPY "%biggest%" "%source% TEMP\%name_1%%name_2%" >nul 2>&1 && DEL "%path%%name_1%*" >nul 2>&1
EXIT /B

Tener en cuenta: esto eliminará toda la carpeta y luego cambiará el nombre de la carpeta temporal en consecuencia. Si tiene algún archivo que no tenga ~ en su nombre entonces esos archivos serán eliminados !!!

FatalBulletHit
fuente
@JuanLopez Me alegro de poder ayudar! :)
FatalBulletHit