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

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

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

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 conservar 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 hacerlo. 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 tamaño más pequeño y solo conservar la versión de mayor tamaño y, si no hay duplicados, conservar esa versión.

Respuesta1

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 tiene un ~nombre, ¡¡¡esos archivos se eliminarán !!!

información relacionada