類似した複数のファイルのグループ、または 1 つのファイルに別のファイルの一部が含まれているファイルを見つける優れたソフトウェアはありますか?
たくさんのファイルが混在するディレクトリがあります。ファイルの中には異なるバージョンのファイルがあり、ファイル名がおかしくなっています。
答え1
diff を使用して 2 つのファイルを比較し、'wc -l' で差異のあるテキストの行数を数えてから、比較する両方のファイルの実際の行数を数えるとどうでしょうか。diff の行数がファイルの実際の行数よりも大幅に少ない場合、ファイルは類似していると言っても過言ではありません。少なくとも、これは第一歩です。
あなたがやろうとしていることは、次のようになります。注記:これは非バイナリファイルを扱っていると仮定しています
まず、各ファイルの行数を取得します。
$ cat <file1> | wc -l
24
$ cat <file2> | wc -l
18
$ cat <file3> | wc -l
25
$ cat <file4> | wc -l
4
次に、ディレクトリを調べて、ファイルを 'diff' で比較し、行の違いを数えます。
$ diff <file1> <file2> | wc -l
47
$ diff -ib <file1> <file3> | wc -l
12
$ diff -ib <file1> <file4> | wc -l
34
それが基本的な考え方です。
以下のスクリプトは、これを自動的に実行し (現在のディレクトリで操作)、差分がいずれかのファイルの行数より少ない場合は常にエコー出力します。これを変更して、どちらかのファイルの行数より 10 以上少ない差分行数の一致のみを検索するように、より慎重にすることもできます。
for i in `ls`; do
for f in `ls`; do
if [ $i != $f ]; then
F_LINES=`cat $f | wc -l`;
I_LINES=`cat $i | wc -l`;
DIFF=`diff -ib $i $f | wc -l`;
if [ $I_LINES -ge $DIFF ]; then
if [ $F_LINES -ge $DIFF ]; then
echo "SIMILAR: $i [lines: $I_LINES] - $f [lines: $F_LINES] - # lines different: $DIFF";
fi;
fi;
fi;
done;
done
このスクリプトは、前述したように、特別なものではなく、大幅に簡略化することもできますが、私はこれをその場で実行しています。出力は次のようになります (上記のテスト ファイルの例の場合)。
SIMILAR: <file1> [lines: 24] - <file3> [lines: 25] - # lines different: 12
SIMILAR: <file3> [lines: 25] - <file1> [lines: 24] - # lines different: 12