Que tal usar o diff para comparar dois arquivos, contando as linhas do texto diferenciado com 'wc -l' e depois contando as linhas reais em ambos os arquivos comparados. Se as linhas de comparação forem significativamente menores que as linhas reais dos arquivos, é seguro dizer que os arquivos são mais parecidos do que não. Isso é um começo, pelo menos.
Aqui está a ideia do que você estaria fazendo. NOTA : isto está assumindo que você está lidando com arquivos não-binários
Primeiro, você deseja obter a contagem de linhas de cada arquivo:
$ cat <file1> | wc -l
24
$ cat <file2> | wc -l
18
$ cat <file3> | wc -l
25
$ cat <file4> | wc -l
4
Em seguida, percorra o diretório, comparando os arquivos com 'diff' e contando as diferenças de linha:
$ diff <file1> <file2> | wc -l
47
$ diff -ib <file1> <file3> | wc -l
12
$ diff -ib <file1> <file4> | wc -l
34
Essa é a ideia básica.
O script abaixo fará isso por você (opera no diretório atual) e ecoará a qualquer momento em que o diff for menor que a quantidade de linhas em um dos arquivos. Você poderia modificar isso para ser mais cauteloso, encontrando apenas correspondências para contagens de linhas de diferenças que são mais de 10+ menores que os números de linha de qualquer arquivo.
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
Este script, como eu disse, nada de especial e poderia ser muito simplificado, mas estou fazendo isso na hora. Ele produziria algo assim (dado o exemplo do arquivo de teste acima).
SIMILAR: <file1> [lines: 24] - <file3> [lines: 25] - # lines different: 12
SIMILAR: <file3> [lines: 25] - <file1> [lines: 24] - # lines different: 12