@echo off
setlocal
for %%A in (*.zip) do (
for /f "eol=| delims=(" %%B in ("%%~nA") do (
set "string=%%~B"
call :trim
for /f "skip=1 eol=| delims=" %%C in (
'call dir /b /o-s "%%string%%*.zip"'
) do (
del "%%~C"
)
)
)
exit /b
:trim
if "%string:~-1%" == " " set "string=%string:~0,-1%" & goto :trim
for /f "tokens=*" %%A in ("%string%") do set "string=%%~A"
exit /b 0
Так я бы попытался выполнить задачу. Быть несколькими миллионами файлов - это большая проблема, поэтому пытаться делать все это в памяти с помощью сортировки et c. может быть сложно. Он пытается перебрать файл, получить базовое имя ( строку перед любыми закрывающими скобками ) и добавить *.zip
, чтобы отсортировать файлы и удалить файлы меньшего размера, оставив только самый большой файл. , Надеюсь, у вас не слишком много одного базового имени, например johnny
.
. Хотя я провел несколько простых тестов, это не доказано полностью без сомнения. Может быть безопаснее использовать ren
вместо del
, например: ren "%%~C" "%%~nC.bak"
. Если что-то не так, используйте ren *.bak *.zip
для отмены. Если правильно del *.bak
. Протестируйте небольшую группу скопированных файлов, чтобы убедиться, что она работает должным образом. Я утверждаю, что del
нельзя отменить.
dir /b /o-s
будет сортировать по размеру ( по величине 1-й ), поэтому просто нужно skip 1
и удалить остальные. call
используется для расширения %%string%%
, поэтому использование отложенного расширения не используется. Метка :trim
удаляет пробелы в любом конце строки, которые присутствуют после разделения на (
, поэтому для правильного поиска по шаблону необходимо удалить пробел.