2

私は同じだが、ファイル名が違うと思うファイルを比較するための最良の方法を探しています。 BeyondCompareのような比較ツールは素晴らしいですが、別々のファイル名を扱っていません。別々のフォルダ内のファイルを比較するとき、どちらの側でも同じ名前のファイルとの比較を試みます。Beyond Compareのようなdiffツールがバイナリ比較を実行するためにペアとして見えるように、同様のファイル名と名前を一致させるにはどうすればよいですか?

(私はBeyondCompareのために働いたり財務的関心を持っていませんが、私はツールをたくさん使い、いくつかの素晴らしい機能を持っています。

名前が異なるいくつかのフォルダツリーのどの場所でもファイルをマッチングさせるためのMindGems Fast Duplicate File Finderがありますが、これはCRCチェックに基づいています。このツールを使用していますが、フォルトはありませんが、BeyondCompareほど信頼できません。 BeyondCompareは、ファイルの完全なバイナリ比較を行うための完全な部分を提供します。

私の場合、ファイルには類似した名前が付いていますが、その違いは単語、句読点、大文字と小文字の違い、すべての単語の順序が異なります。したがって、ファイルの部分文字列が順不同である可能性があるため、Beyond Compareのようないくつかの差分ツールが既に提供しているファイルと一致する正規表現フィルタを使用するのは簡単ではありません。

私は、ファイル名を同じにする前に同様のファイル名をマッチさせてから、BeyondCompareのようなツールにそれらのファイルを 'フィード'する方法を探しています。ソリューションはスクリプトでも、アプリケーションの形でもかまいません。

現時点で私は、ファイル名が上記のように似ている私の問題に合うようにファイル名を一致させるアルゴリズム(Perlで実装する)を考えています。

あなたは何かより良いアプローチを提案できますか全く異なるアプローチですか?

  1. ハッシュを作る

  2. 区切り文字として 英数字以外の文字またはスペースを使用して、正確に同じファイルサイズ

  3. 最初のファイルからの英数字ストリングのハッシュを作成して、ファイルのリストを表示して下さい第2ファイルの英数字部分文字列のうち、 英数字以外の文字またはスペースを区切り文字として使用

  4. 一致する出現

  5. 部分文字列の数が最も多いファイルを特定します。

  6. の一致数を部分文字列の最大数で割って、ペアの比較のパーセンテージスコアを計算します。

  7. 正確な ファイルサイズは、他のすべてのファイルと、ファイルごとに繰り返し比較

  8. ファイルの提案を比較するために取得する割合スコアによりペアの比較を並べ替えます。

  9. ペア内の1つのファイルの名前を変更して、他のファイルと同じにします。別々のフォルダに配置します。

  10. BeyondCompareのような比較ツールをファイル、フォルダ比較モードで実行します。

答えて

1

私はすでに高速重複ファイルファインダーProを持っているように、これはCSVやXML形式で重複のテキストのレポートを出力します。

CSVをグループ化してファイルの名前を変更し、完全なバイナリ比較を比較できるように処理します。

更新:

そしてここでは私のコードです。このPerlスクリプトは、同じディレクトリである(比較されているディレクトリ/フォルダ内の)ファイルの各ペアを調べ、そのうちの1つを他と同じ名前に変更して、2つのフォルダをBeyond Compareフルバイナリ比較(flattenフォルダオプションがオンの場合)バイナリ比較は一致を確認するので、各複製ペアの1つをパージすることができます。

#!/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

これを超えて比較することができます。 左側のファイルと右側のファイルを選択するだけです。 '比較'を選択するか、整列機能を使用してください(マウスの右ボタン)

+0

はい、これらは手動の手順です。私の質問から、私はBeyond Compareが、比較のために、最初に似た名前を持つ多くのファイルのペアを自動的に認識したいと思っています。 – therobyouknow

関連する問題