Se você tem 200-300 arquivos, isso é um monte de comparações. Supondo que foram 200 arquivos, então você teria
200 * 199 / 2
ou 19900 comparações (consulte Como obtenho o número total de pares únicos de um conjunto no banco de dados? ).
Além de lidar com o número de combinações, você precisa de uma maneira de medir o número de linhas comuns. Você poderia usar uma abordagem como diffstat
e contar o número de linhas adicionadas e excluídas, por exemplo, em um script de shell, e tratar isso como alterar , subtrair do tamanho do arquivo para obter linhas inalteradas :
#!/bin/sh
change=$(diff "$1" "$2" | grep '^[<>]' | wc -l)
change=$(expr $change / 2)
size1=$(wc -l "$1"| awk '{print $1;}')
size2=$(wc -l "$2"| awk '{print $1;}')
unchanged1=$(expr $size1 - $change)
unchanged2=$(expr $size2 - $change)
[ $unchanged1 -gt 20 ] && echo "$unchanged1 unchanged lines in $1 vs $2"
Neste exemplo, eu calculei, mas não usei o valor unchanged2
(os números não precisam ser os mesmos, e confundir o relatório pode torná-lo menos legível).
Mas isso é apenas para ilustrar a abordagem: gerenciar as 20 mil comparações irá mantê-lo ocupado. Por exemplo, você pode fazer o script de exemplo produzir resultados formatados como um arquivo CSV:
[ $unchanged1 -gt 20 ] && echo "$unchanged1,\"$1\",\"$2\""
[ $unchanged2 -gt 20 ] && echo "$unchanged2,\"$2\",\"$1\""
e (chamando compare-files
), use isso como
#!/bin/sh
echo "CHANGES,FILE1,FILE2" >report.csv
for file1 in *
do
echo "comparing $file1" >&2
for file2 in *
do
compare-files "$file1" "$file2" >>report.csv
done
done