Как сопоставить одинаковые имена файлов и переименовать их так, чтобы инструменты сравнения, такие как Beyond Compare, рассматривали их как пару для выполнения двоичного сравнения? - PullRequest
3 голосов
/ 31 января 2012

Я ищу лучший подход к сравнению файлов, которые, на мой взгляд, идентичны, но имеют разные имена файлов.Инструменты сравнения, такие как BeyondCompare, хороши, но они еще не обрабатывают разные имена файлов - при сравнении файлов в отдельных папках они пытаются сравнить файлы с одинаковыми именами с обеих сторон.

(я не работаю дляили у меня есть финансовый интерес к BeyondCompare, но я часто использую этот инструмент и обнаружил, что он обладает некоторыми замечательными функциями).

Существует MindGems Fast Duplicate File Finder для сопоставления файлов в любом месте через несколько деревьев папок, которые имеют разныеимена, но это основано на проверках CRC, я полагаю, я использую этот инструмент, но я только доверяю ему, пока нет ошибок, но пока не доверяю ему так же, как BeyondCompare.BeyondCompare предлагает полную возможность выполнить полное двоичное сравнение файла.

В моем случае файлы, как правило, имеют одинаковые имена, различие заключается в упорядочении слов, пунктуации, падеже и не во всех словах.подарок.Поэтому нелегко использовать фильтр регулярных выражений для сопоставления файлов, которые уже предоставляются некоторыми инструментами сравнения, такими как Beyond Compare, поскольку подстроки файлов могут быть не в порядке.

Я ищу способ сопоставления похожих имен файлов до того, какпереименуйте файлы, чтобы они были одинаковыми, а затем «подайте» их на инструмент вроде BeyondCompare.Решения могут быть сценариями или, возможно, в форме приложения.

В настоящий момент у меня есть идея алгоритма (для реализации в Perl), который соответствует именам файлов в соответствии с моей проблемой, в силу чего имена файлов похожи, как описановыше.

Можете ли вы предложить что-то лучшее или совершенно другой подход?

  1. Найти список файлов с точно таким же размером файла

  2. Создать хэш алфавитно-цифровых подстрок из первого файла, используя не буквенно-цифровые символы или пробел в качестве разделителя

  3. Создать хэш алфавитно-цифровых подстрок из второго файла, используя не буквенно-цифровые символы илипробел в качестве разделителя

  4. Совпадения вхождений

  5. Найти, какой файл имеет наибольшее количество подстрок.

  6. Рассчитать процентный показатель для сравнения в паре на основе количества совпадений, разделенного на наибольшее количество подстрок.

  7. Повторить сравнение для each файл с каждым другим файлом с точным размером файла

  8. сортировка парных сравнений по процентному показателю, чтобы получить предложения файлов для сравнения.

  9. Переименуйте один файл в паре, чтобы он совпадал с другим.Поместите в отдельные папки.

  10. Запустите инструмент сравнения, например, BeyondCompare с файлами, режим сравнения папок.

Ответы [ 2 ]

1 голос
/ 31 января 2012

Поскольку у меня уже есть 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;
    }
0 голосов
/ 21 января 2016

Beyond Compare может сделать это. Просто выберите файл слева и файл для сравнения справа. Выберите «Сравнить» или используйте функцию выравнивания (правая кнопка мыши)

...