windows - 如何删除目录中的重复文件和次要文件
问题描述
我在一个目录中有几百万个文件:
大小 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” 什么都不做...
请问我该怎么办?
解决方案
@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
删除了由 分隔后存在的字符串两端的空格(
,因此需要删除空格才能使通配符搜索正常工作。
推荐阅读
- amazon-web-services - 查找谁在联合 AWS 账户中创建了 s3 存储桶
- python - 如何将来自我的机器人的消息放入 Discord 的黑匣子中?
- pandas - 从数据框列的字符串中提取数值并用该数值替换字符串
- php - 如何在 codeigniter PHP 7.3 中按 Mongodb 中的总字数对数据 ASC 进行排序
- javascript - Javascript计算器不显示值?
- rest - 如何使用是/否字段过滤 REST API URL 中的列表
- angular - Angular Flex 布局 - fxLayoutGap.lt-lg="0px grid" - 在 Safari 中不起作用
- sql - 从一行中具有相同 id 的表中选择 Min 和 Max Value
- authentication - 使用客户端 ID 和客户端密码调用由 AAD 保护的 azure 函数
- php - 考虑营业时间,检索两个日期之间的剩余时间