Löschen Sie doppelte Dateien basierend auf der Dateigröße mit Windows Batch

Löschen Sie doppelte Dateien basierend auf der Dateigröße mit Windows Batch

Ich habe eine Reihe von Dateien in einem Verzeichnis (mit Unterverzeichnissen) mit ähnlichen Namen, nur dass die letzte Ziffer eine andere Zahl ist. Ich möchte die Version mit der größten Dateigröße behalten. Einige Dateien haben zwar keine Duplikate, aber ich muss diese Datei behalten.

Dateien werden aussehen

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)

Ich möchte nur die größte Versionsgröße behalten.

111~2.mp4    (5mb)

222~1.mp4    (3mb)

333~2.mp4    (4mb)

444~4.mp4    (7mb)

Ich fürchte, ich bin ratlos, ich habe gesucht, aber es nicht geschafft, es zum Laufen zu bringen, was ich bisher getan habe, ist, die Größe der Dateien zu ermitteln

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

aber jetzt muss ich die Duplikate miteinander vergleichen und die kleinere Version löschen und nur die größere Version behalten und wenn es keine Duplikate gibt, dann diese Version behalten.

Antwort1

Das hier sollte funktionieren:

@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

Bedenken:Dadurch wird der gesamte Ordner gelöscht und der temporäre Ordner entsprechend umbenannt. Wenn Sie Dateien haben, die kein ~im Namen haben, werden diese Dateien gelöscht!!!

verwandte Informationen