Existe uma aplicação para encontrar documentos semelhantes?

0

Existe algum software bom que encontre grupos de vários arquivos semelhantes ou em que um arquivo inclua partes de outro?

Eu tenho um diretório com muitos arquivos misturados. Entre os arquivos, estão diferentes versões de arquivos, e os nomes dos arquivos estão confusos.

    
por sawa 23.03.2012 / 23:28

1 resposta

1

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
    
por 03.04.2012 / 21:25