如何匹配相似的文件名并重命名,以便像Beyond Compare这样的差异工具将它们视为一对进行二进制比较?

3
我正在寻找最佳方法来比较我认为是相同但具有不同文件名的文件。像BeyondCompare这样的比较工具非常好,但它们尚未处理不同的文件名——在比较分开的文件夹中的文件时,它们会尝试比较两侧具有相同名称的文件。
(我不为BeyondCompare工作,也没有任何经济利益,但我经常使用这个工具,并发现它有一些很棒的功能)。
有MindGems Fast Duplicate File Finder可以匹配具有不同名称的几个文件树中的任何位置的文件,但我认为它是基于CRC检查的,我正在使用这个工具,但我只是逐渐信任它,到目前为止没有故障,但还不像Beyond Compare那样信任它。 BeyondCompare提供了对文件进行完全二进制比较的完全保证。
在我的情况下,这些文件倾向于具有类似的名称,不同之处在于单词的顺序,标点符号,大小写差异和不是所有单词都存在。因此,很难使用正则表达式过滤器来匹配文件,例如Beyond Compare等一些差异工具已经提供的匹配文件子字符串可以是无序的。
我正在寻找一种在将文件重命名为相同并“输入”它们到Beyond Compare之类的工具之前匹配类似文件名的方法。解决方案可以是脚本或可能以应用程序的形式出现。
目前,我有一个算法的想法(要在Perl中实现)来匹配我的问题适合的文件名,其中文件名如上所述相似。
你能提出更好的建议或完全不同的方法吗?
1.查找具有完全相同文件大小的文件列表 2.从第一个文件中获取包含字母数字子字符串的哈希表,使用非字母数字字符或空格作为分隔符 3.从第二个文件中获取包含字母数字子字符串的哈希表,使用非字母数字字符或空格作为分隔符 4.匹配出现次数 5.查找哪个文件具有最多的子字符串。 6.根据匹配数量除以最高子字符串数量计算对成对比较的百分比得分。 7.重复将每个文件与具有完全相同文件大小的每个其他文件进行比较 8.按百分比得分对配对进行排序,以获得要比较的文件的建议。 9.重命名一对文件,使其与另一个文件相同。放置在不同的文件夹中。 10.运行BeyondCompare之类的比较工具,以文件夹比较模式比较文件。
2个回答

1

由于我已经拥有Fast Duplicate File Finder Pro,它可以以CSV和XML格式输出重复项的文本报告。

我将处理CSV文件以查看分组,并重命名文件,以便可以使用Beyond Compare对它们进行完全二进制比较。

更新:

这是我的代码。 这个Perl脚本将查看每一对相同的文件(在被比较的目录/文件夹中),并将其中一个重命名为另一个,以便可以通过Beyond Compare运行这两个文件夹,它将执行完全二进制比较(如果打开了“展平文件夹”选项)。 二进制比较确认匹配,这意味着可以清除每个重复对中的一个。

#!/usr/bin/perl -w 

use strict;
use warnings;


use File::Basename;

my $fdffCsv = undef;

# fixed
# put matching string - i.e. some or all of path of file to keep here e.g. C:\\files\\keep\\ or just keep
my $subpathOfFileToKeep = "keep";
# e.g. jpg mp3 pdf etc.
my $fileExtToCompare = "jpg";

# changes
my $currentGroup = undef;
my $group = undef;
my $filenameToKeep = "";

my $path = undef;
my $name = undef;
my $extension = undef;
my $filename = undef;

open ( $fdffCsv, '<', "fast_duplicate_filefinder_export_as_csv.csv" );

my @filesToRenameArray = ();

while ( <$fdffCsv> )
{
  my $line = $_;

  my @lineColumns = split( /,/, $line );

  # is the first column and index value
  if ( $lineColumns[0] =~ m/\d+/ )
  {
    $group = $lineColumns[0];

    ( $line ) =~ /("[^"]+")/;
    $filename = $1;

    $filename =~ s/\"//g;

    if ( defined $currentGroup )
    {
      if ( $group == $currentGroup )
      {
        ( $name, $path, $extension ) = fileparse ( $filename, '\..*"' );

    store_keep_and_rename();
      }
      else # group changed
      {
        match_the_filenames();

    ( $name, $path, $extension ) = fileparse ( $filename, '\..*"' );

    store_keep_and_rename();
      }
    }
    else # first time - beginning of file
    {
      $currentGroup = $group;

      ( $name, $path, $extension ) = fileparse ( $filename, '\..*"' );

      store_keep_and_rename();
    }
  }
}

close( $fdffCsv );

match_the_filenames();

sub store_keep_and_rename
{
        if ( $path =~ /($subpathOfFileToKeep)/ )
      {
        $filenameToKeep = $name.$extension;
      }
      else
      {
        push( @filesToRenameArray, $filename );
      }
}

sub match_the_filenames
{
    my $sizeOfFilesToRenameArraySize = scalar( @filesToRenameArray );

        if ( $sizeOfFilesToRenameArraySize > 0 )
    {
      for (my $index = 0; $index < $sizeOfFilesToRenameArraySize; $index++ )
      {
        my $PreRename = $filesToRenameArray[$index];

        my ( $preName, $prePath, $preExtension ) = fileparse ( $PreRename, '\..*' );
        my $filenameToChange = $preName.$preExtension;

        my $PostRename = $prePath.$filenameToKeep;

        print STDOUT "Filename was: ".$PreRename."\n";
        print STDOUT "Filename will be: ".$PostRename."\n\n";

        rename $PreRename, $PostRename;
      }
    }

    undef( @filesToRenameArray ); @filesToRenameArray = ();

    $currentGroup = $group;
    }

0
Beyond Compare可以做到这一点。 只需在左侧选择文件,右侧选择要比较的文件。 选择“比较”或使用对齐功能(右键单击)。

1
是的,但那些都是手动步骤。从我的问题来看,我希望Beyond Compare首先自动识别许多具有相似名称的文件对进行比较。 - therobyouknow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接