Existe um aplicativo para encontrar documentos semelhantes?

Existe um aplicativo para encontrar documentos semelhantes?

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

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

Responder1

Que tal usar diff para comparar dois arquivos, contando as linhas de 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 semelhantes do que não. Isso é um começo, pelo menos.

Aqui está a ideia do que você estaria fazendo.OBSERVAÇÃO:isso pressupõe que você esteja 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 para você (opera no diretório atual) e ecoará sempre que a diferença for menor que a quantidade de linhas em qualquer um dos arquivos. Você pode modificar isso para ser mais cauteloso, encontrando apenas correspondências para contagens de linhas diferentes que sejam mais de 10+ menores que os números de linha de qualquer um dos arquivos.

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, não tem nada de especial e poderia ser bastante simplificado, mas estou fazendo isso na hora. A saída seria 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

informação relacionada