Batch file 比较文件名并显示与大多数单词匹配的文件?

Batch file 比较文件名并显示与大多数单词匹配的文件?,batch-file,Batch File,我需要一种方法来计算文件名中匹配单词的数量,以便确定这些文件是否可能是关于同一主题的。我知道如何将文件名转换为变量 set count=0 for %%i in (%filename%) do set "word%count%=%%i" && set /a "count+=1" …但我需要一种方法将其与大量文件进行比较,并显示最佳匹配,这有点超出我的技能水平。我至少需要一个正确的方向,让我开始 这里有一个例子来说明我的意思;这是一个仅包含5个要比较的文件的示例集 From Du

我需要一种方法来计算文件名中匹配单词的数量,以便确定这些文件是否可能是关于同一主题的。我知道如何将文件名转换为变量

set count=0
for %%i in (%filename%) do set "word%count%=%%i" && set /a "count+=1"
…但我需要一种方法将其与大量文件进行比较,并显示最佳匹配,这有点超出我的技能水平。我至少需要一个正确的方向,让我开始

这里有一个例子来说明我的意思;这是一个仅包含5个要比较的文件的示例集

From Dusk Till Dawn (1996) Robert Rodriguez [Horror, Action, Thriller, Crime] r6.9 1080p x265 AAC tt0116367.mkv
Full Metal Jacket (1987) Stanley Kubrick [Drama, War] r7.8 1080p x265 AAC tt0093058.mkv
Full Metal Jacket LOCKED AND LOADED Fanedit (1987) Stanley Kubrick [Drama, War] r7.8 720p x264 AC3 tt0093058.mkv
Desperado (1995) Robert Rodriguez [Thriller, Action, Crime] r6.8 1080p x265 AAC tt0112851.mkv
King of New York (1990) Abel Ferrara [Thriller, Crime] r6.5 1080p x265 AAC tt0099939.mp4
它应该能够处理文件的整个目录树。结果对应按匹配数量的顺序列出:

10 words match
Full Metal Jacket (1987) Stanley Kubrick [Drama, War] r7.8 1080p x265 AAC tt0093058.mkv
Full Metal Jacket LOCKED AND LOADED Fanedit (1987) Stanley Kubrick [Drama, War] r7.8 720p x264 AC3 tt0093058.mkv

8 words match
From Dusk Till Dawn (1996) Robert Rodriguez [Horror, Action, Thriller, Crime] r6.9 1080p x265 AAC tt0116367.mkv
Desperado (1995) Robert Rodriguez [Thriller, Action, Crime] r6.8 1080p x265 AAC tt0112851.mkv

5 words match
From Dusk Till Dawn (1996) Robert Rodriguez [Horror, Action, Thriller, Crime] r6.9 1080p x265 AAC tt0116367.mkv
King of New York (1990) Abel Ferrara [Thriller, Crime] r6.5 1080p x265 AAC tt0099939.mp4

..and so on
我希望所需匹配项的数量可以调整,例如,不要显示匹配词少于6个的文件。

@ECHO OFF
SETLOCAL
设置/a计数=0
对于(*)中的%%i,执行设置/a计数+=1并调用设置“word%%count%%=%i”
设置wo
后藤:EOF
我将文件掩码更改为
*
,以适应我的系统

set/a
不需要引号并忽略空格。使用引号确保指定的字符串值中不包含尾随空格

在指定文件名之前移动
设置计数
,可确保编号从
开始,在
计数`结束

调用
集合
解析
集合
,因此
%%i
将被它的值替换,因为它是元变量,而其他
%%
将被
%%
替换,因为
%%
转义
%%
,那么
集合
是否作为“set”字%count%=值%%i”执行

set wo
显示所有变量开始于
wo

@ECHO OFF
SETLOCAL
设置/a计数=0
对于(*)中的%%i,执行设置/a计数+=1并调用设置“word%%count%%=%i”
设置wo
后藤:EOF
我将文件掩码更改为
*
,以适应我的系统

set/a
不需要引号并忽略空格。使用引号确保指定的字符串值中不包含尾随空格

在指定文件名之前移动
设置计数
,可确保编号从
开始,在
计数`结束

调用
集合
解析
集合
,因此
%%i
将被它的值替换,因为它是元变量,而其他
%%
将被
%%
替换,因为
%%
转义
%%
,那么
集合
是否作为“set”字%count%=值%%i”执行


set wo
显示所有以
wo

开头的变量。您应该注意,StackOverflow不是免费的代码编写服务。然而,这个问题对我来说相当有趣,所以我做了一个例外

@echo off
setlocal EnableDelayedExpansion

set "minMatch=5"

rem Process all files in current directory
set /A "i=0, maxMatch=0"
for /F "delims=" %%i in ('dir /A-D /B') do (
   set /A i+=1
   set "file[!i!]=%%~NXi"

   rem Compare this file vs. all files below it
   set "j=0"
   for /F "delims=" %%j in ('dir /A-D /B') do (
      set /A j+=1
      if !j! gtr !i! (

         rem Compare words, count match and store this pair of names
         set "n=0"
         for %%a in (%%~NXi) do for %%b in (%%~NXj) do (
            if /I "%%a" equ "%%b" set /A n+=1
         )
         if !n! geq %minMatch% (
            for %%n in (!n!) do set "match[%%n]=!match[%%n]! !i!+!j!"
            if !n! gtr !maxMatch! set /A maxMatch=n
         )

      )
   )

)

rem Show results
for /L %%n in (%maxMatch%,-1,%minMatch%) do if defined match[%%n] (
   echo %%n words match
   for %%m in (!match[%%n]!) do for /F "tokens=1,2 delims=+" %%i in ("%%m") do (
      echo !file[%%i]!
      echo !file[%%j]!
      echo/
   )
   echo/
)
输出示例:

10 words match
Full Metal Jacket (1987) Stanley Kubrick [Drama, War] r7.8 1080p x265 AAC tt0093058.mkv
Full Metal Jacket LOCKED AND LOADED Fanedit (1987) Stanley Kubrick [Drama, War] r7.8 720p x264 AC3 tt0093058.mkv


7 words match
From Dusk Till Dawn (1996) Robert Rodriguez [Horror, Action, Thriller, Crime] r6.9 1080p x265 AAC tt0116367.mkv
Desperado (1995) Robert Rodriguez [Thriller, Action, Crime] r6.8 1080p x265 AAC tt0112851.mkv


5 words match
Desperado (1995) Robert Rodriguez [Thriller, Action, Crime] r6.8 1080p x265 AAC tt0112851.mkv
King of New York (1990) Abel Ferrara [Thriller, Crime] r6.5 1080p x265 AAC tt0099112851.mkv

您必须意识到,此程序中涉及的操作数量会随着文件数量和每个文件中的字数的增加而增加。如果要处理的文件数量很大,则此程序可能需要太多时间才能完成…

您应该注意,StackOverflow不是免费的代码编写服务。然而,这个问题对我来说相当有趣,所以我做了一个例外

@echo off
setlocal EnableDelayedExpansion

set "minMatch=5"

rem Process all files in current directory
set /A "i=0, maxMatch=0"
for /F "delims=" %%i in ('dir /A-D /B') do (
   set /A i+=1
   set "file[!i!]=%%~NXi"

   rem Compare this file vs. all files below it
   set "j=0"
   for /F "delims=" %%j in ('dir /A-D /B') do (
      set /A j+=1
      if !j! gtr !i! (

         rem Compare words, count match and store this pair of names
         set "n=0"
         for %%a in (%%~NXi) do for %%b in (%%~NXj) do (
            if /I "%%a" equ "%%b" set /A n+=1
         )
         if !n! geq %minMatch% (
            for %%n in (!n!) do set "match[%%n]=!match[%%n]! !i!+!j!"
            if !n! gtr !maxMatch! set /A maxMatch=n
         )

      )
   )

)

rem Show results
for /L %%n in (%maxMatch%,-1,%minMatch%) do if defined match[%%n] (
   echo %%n words match
   for %%m in (!match[%%n]!) do for /F "tokens=1,2 delims=+" %%i in ("%%m") do (
      echo !file[%%i]!
      echo !file[%%j]!
      echo/
   )
   echo/
)
输出示例:

10 words match
Full Metal Jacket (1987) Stanley Kubrick [Drama, War] r7.8 1080p x265 AAC tt0093058.mkv
Full Metal Jacket LOCKED AND LOADED Fanedit (1987) Stanley Kubrick [Drama, War] r7.8 720p x264 AC3 tt0093058.mkv


7 words match
From Dusk Till Dawn (1996) Robert Rodriguez [Horror, Action, Thriller, Crime] r6.9 1080p x265 AAC tt0116367.mkv
Desperado (1995) Robert Rodriguez [Thriller, Action, Crime] r6.8 1080p x265 AAC tt0112851.mkv


5 words match
Desperado (1995) Robert Rodriguez [Thriller, Action, Crime] r6.8 1080p x265 AAC tt0112851.mkv
King of New York (1990) Abel Ferrara [Thriller, Crime] r6.5 1080p x265 AAC tt0099112851.mkv

您必须意识到,此程序中涉及的操作数量会随着文件数量和每个文件中的字数的增加而增加。如果要处理的文件数量很大,则此程序可能需要太多时间才能完成…

那么如何使用此程序与大量文件进行实际比较并声明结果?我想我需要一个数据库文件,每行都是
D:\Path to\file Name.ext | The | file | Name
,然后比较每个文件名中匹配的单词数。执行操作或显示顶级匹配对需要完整的文件路径。那么如何使用此路径与大量文件进行实际比较并声明结果?我想我需要一个数据库文件,每行都是
D:\Path to\file Name.ext | The | file | Name
,然后比较每个文件名中匹配的单词数。执行操作或显示顶级匹配对需要完整的文件路径。是否要将
file1
的每个单词与
file2
的每个单词进行比较?或者只是比较第一个单词和第一个单词,第二个单词和第二个单词,等等……是的,每个单词和每个单词,不管顺序如何。用空格隔开为了编写一个有效的解决方案,我需要你发布一个包含8-10个文件名的列表,以及基于该列表的输出。问题是,请不要在评论中发布任何数据。准备好后,在此处发表评论并包括@Aacini reference…@Aacini question updated是否要将
file1
的每个单词与
file2
的每个单词进行比较?或者只是比较第一个单词和第一个单词,第二个单词和第二个单词,等等……是的,每个单词和每个单词,不管顺序如何。用空格隔开为了编写一个有效的解决方案,我需要你发布一个包含8-10个文件名的列表,以及基于该列表的输出。问题是,请不要在评论中发布任何数据。当你准备好了,在这里发表评论,并包括@Aacini reference…@Aacini question updated哇,这比我想象的要复杂得多,很抱歉在离开的时候问你。非常好,非常感谢你,先生!我必须对其进行反向工程,以便添加一个“要忽略的单词”列表(如
1080p
),并可能以某种方式使
[Action,
Action]
等单词匹配。我不能再问你了,除非你也觉得有趣。。。再次感谢!尊重。哇,这比我想象的要复杂得多,很抱歉在我离开的时候问你。非常好,非常感谢你,先生!我将不得不对其进行反向工程,以便添加一个“要忽略的单词”列表(如
1080p
),并可能以某种方式生成类似
[Action,
Action]
ma的单词