it-swarm-ja.com

Windowsバッチでファイルサイズに基づいて重複ファイルを削除します

最後の桁が異なる番号であることを除いて、同じような名前のディレクトリ(サブディレクトリを含む)にたくさんのファイルがあります。最大のファイルサイズのバージョンを保持したいと思います。ただし、一部のファイルには重複がありませんが、そのファイルを保持する必要があります。

ファイルは次のようになります

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)

最大のバージョンサイズのみを保持したいと思います。

111~2.mp4    (5mb)

222~1.mp4    (3mb)

333~2.mp4    (4mb)

444~4.mp4    (7mb)

私は困惑したのではないかと心配しています。検索してきましたが、これまでに行ったことを実行できませんでした。ファイルのサイズを取得できます。

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

しかし今、私は重複を互いに比較し、小さいサイズのバージョンを削除し、大きいサイズのバージョンのみを保持し、それらが重複していない場合はそのバージョンを保持する必要があります。

3
Juan Lopez

これでうまくいくはずです:

@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

注意:これにより、フォルダ全体が削除され、それに応じて一時フォルダの名前が変更されます。名前に~が含まれていないファイルがある場合、それらのファイルは削除されます!!!

4
FatalBulletHit