大小07kb-“ johnny.zip”
大小57kb-“ johnny(1).zip”
大小13kb-“ johnny(2).zip”
大小12kb-“ dhick.zip”
大小11kb-“ dhick(5).zip”
大小34kb-“ dhick(8).zip”
我只希望为找到的每个名称保留一个最大的文件。在这种情况下,消除所有其他较小且重复的对象:
大小07kb-“ johnny.zip” <<
size 57kb-“ johnny(1).zip” 不执行任何操作...
大小13kb-“ johnny(2).zip” <<
大小12kb-“ dick.zip” <<
大小11kb-“迪克(5).zip” <<
size 34kb-“迪克(8).zip” 不执行任何操作...
@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
这是我将尝试完成任务的方式。由于只有几百万个文件,因此尝试通过排序等方式在内存中完成所有任务可能很困难。这样做的目的是迭代文件,获取基本名称(任何在右括号前的字符串)并追加*.zip
以对文件进行排序,并删除较小的文件,而仅保留最大的文件。希望您没有太多的一个基本名称,即johnny
。
虽然我已经做了一些简单的测试,但是毫无疑问,这还没有被彻底证明。使用ren
而不是del
可能更安全,例如:ren "%%~C" "%%~nC.bak"
。如果不正确,请使用ren *.bak *.zip
撤消。如果正确del *.bak
。对一小组复制的文件进行测试,以确保其可以正常工作。我说这是因为del
无法撤消。
dir /b /o-s
将按大小排序(最大1st),因此只需要skip 1
并删除其余部分即可。 call
用于扩展%%string%%
,因此不使用延迟扩展。标签:trim
删除字符串两端的空格(
分隔后出现的,因此需要删除该空间,通配符搜索才能正常工作。