3

我正在寻找比较我认为相同但文件名不同的文件的最佳方法。BeyondCompare 之类的比较工具很棒,但它们还不能处理不同的文件名——当比较不同文件夹中的文件时,它们会尝试与两边同名的文件进行比较。

(我不为 BeyondCompare 工作或对 BeyondCompare 没有经济利益,但我经常使用该工具并发现它有一些很棒的功能)。

有 MindGems Fast Duplicate File Finder 用于在多个文件夹树中的任何位置匹配文件还不如 BeyondCompare 那样信任它。BeyondCompare 提供了对文件进行完整二进制比较的完整思路。

在我的情况下,文件往往具有相似的名称,不同之处在于单词的顺序、标点符号、大小写差异以及并非所有单词都存在。因此,使用正则表达式过滤器来匹配某些 diff 工具(如 Beyond Compare)已经提供的文件并不容易,因为文件子字符串可能是无序的。

我正在寻找一种方法来匹配相似的文件名,然后再将文件重命名为相同的文件,然后将它们“提供”给 BeyondCompare 等工具。解决方案可以是脚本,也可以是应用程序的形式。

目前,我有一个算法(在 Perl 中实现)来匹配文件名以适应我的问题,即文件名与上述相似。

你能提出更好的或完全不同的方法吗?

  1. 查找文件大小完全相同的文件列表

  2. 使用非字母数字字符或空格作为分隔符,对第一个文件中的字母数字子字符串进行哈希处理

  3. 使用非字母数字字符或空格作为分隔符,对第二个文件中的字母数字子字符串进行哈希处理

  4. 匹配事件

  5. 查找哪个文件具有最多的子字符串。

  6. 根据匹配数除以最高子字符串数,计算对比较的百分比分数。

  7. 重复比较每个文件与具有确切文件大小的每个其他文件

  8. 按百分比分数对比较进行排序,以获得要比较的文件的建议。

  9. 重命名该对中的一个文件,使其与另一个相同。放在单独的文件夹中。

  10. 使用文件、文件夹比较模式运行 BeyondCompare 之类的比较工具。

4

2 回答 2

1

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

我将处理 CSV 以查看分组并重命名文件,以便我可以超越比较对它们进行完整的二进制比较。

更新:

这是我的代码。此 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;
    }
于 2012-01-31T12:45:25.163 回答
0

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

于 2016-01-20T22:01:24.313 回答