首页 > 解决方案 > 如何删除目录中的重复文件和次要文件

问题描述

我在一个目录中有几百万个文件:

大小 07kb - “johnny.zip”

大小 57kb - “约翰尼 (1).zip”

大小 13kb - “约翰尼 (2).zip”

大小 12kb - “dhick.zip”

大小 11kb - “dhick (5).zip”

大小 34kb - “dhick (8).zip”


我只想为找到的每个名称保留一个最大的文件。消除所有其他较小和重复的,在这种情况下:


大小 07kb - “johnny.zip” <<< 删除这个!(因为重复且尺寸更小)

大小 57kb - “johnny (1).zip” 什么都不做...

大小 13kb -“约翰尼 (2).zip”<<< 删除这个!(因为重复且尺寸更小)

大小 12kb - “dick.zip” <<< 删除这个!(因为重复且尺寸更小)

大小 11kb - "dick (5).zip" <<< 删除这个!(因为重复且尺寸更小)

大小 34kb - “dick (8).zip” 什么都不做...


请问我该怎么办?

标签: windowsbatch-fileduplicatessize

解决方案


@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将按大小(最大的第一个)排序,因此只需要skip 1删除其余部分。call用于扩展,因此%%string%%不使用延迟扩展。该标签:trim删除了由 分隔后存在的字符串两端的空格(,因此需要删除空格才能使通配符搜索正常工作。


推荐阅读