首页 > 解决方案 > 删除目录中的重复文件

问题描述

我有一个工作脚本(如下),它仅按大小比较文件,如果一个或多个文件的大小不同,它会显示在.bat屏幕上

@echo off
setlocal EnableDelayedExpansion

rem Group all file names by size
for /R %%a in (*.*) do (
   set "size[%%~Za]=!size[%%~Za]!,%%~Fa"
)

rem Show groups that have more than one element
for /F "tokens=2,3* delims=[]=," %%a in ('set size[') do (
   if "%%c" neq "" echo [%%a]: %%b,%%c
)
pause

但我需要更多!

我还需要脚本删除重复文件,只保留一个。例如,如果存在3大小相同但名称不同的文件,则脚本应选择保留一个,删除另一个2


@LotPings,我尝试了 2 个 .pdf 文件,并在下图中出现了这条消息:

错误


@LotPings

现在它认得很好!但它不会删除重复项,只是识别....看下图:

在此处输入图像描述

标签: batch-file

解决方案


  • 我认为将具有相同大小的文件视为相同的内容有点幼稚。
    如果有疑问,最好与 fc 进行二进制比较。
  • %%~Fa您在不引用可能包含空格的每个名称的情况下填充字符串的方式可能会在进一步处理中出现问题。
  • 如果文件相同,您可以创建链接。
  • 知道for /r会递归到子目录吗?

以下批处理将以size[]不同的方式处理数组,将大小和内容传递给保留第一个文件和(仅回显)del 命令的子例程。

:: Q:\Test\2018\06\06\SO_50723488.cmd
@echo off & setlocal
rem Group all file names by size
for /R %%a in (*.*) do call set size[%%~Za]=%%size[%%~Za]%%,"%%~Fa"

rem Process groups
for /F "tokens=2* delims=[]=," %%a in ('set size[') do Call :Sub %%a %%b

pause
Goto :Eof

:Sub
If "%~3"=="" (Set "size[%1]="&goto :EOf)
Echo ========================================
Echo processing %*
Echo Keep %2
Shift&shift

:loop
Echo Del  %1
if not "%~2"=="" (shift&goto :loop)

样本输出:

> Q:\Test\2018\06\06\SO_50723488.cmd
========================================
processing 0 "Q:\Test\2018\05\03\Text3.txt","Q:\Test\2018\05\27\log.html"
Keep "Q:\Test\2018\05\03\Text3.txt"
Del  "Q:\Test\2018\05\27\log.html"
========================================
processing 14 "Q:\Test\2018\05\03\Text1.txt","Q:\Test\2018\05\15\HP-G1610-20180515.json"
Keep "Q:\Test\2018\05\03\Text1.txt"
Del  "Q:\Test\2018\05\15\HP-G1610-20180515.json"
========================================
processing 21 "Q:\Test\2018\05\12\text1.txt","Q:\Test\2018\05\12\text2.txt"
Keep "Q:\Test\2018\05\12\text1.txt"
Del  "Q:\Test\2018\05\12\text2.txt"
========================================
processing 22 "Q:\Test\2018\05\20\2.txt","Q:\Test\2018\05\22\version.ps1"
Keep "Q:\Test\2018\05\20\2.txt"
Del  "Q:\Test\2018\05\22\version.ps1"
========================================
processing 288 "Q:\Test\2018\05\11\RawData.txt","Q:\Test\2018\05\23\SO_50478080.ps1"
Keep "Q:\Test\2018\05\11\RawData.txt"
Del  "Q:\Test\2018\05\23\SO_50478080.ps1"

推荐阅读