¿Existe una aplicación para buscar documentos similares?

¿Existe una aplicación para buscar documentos similares?

¿Existe algún buen software que encuentre grupos de varios archivos que sean similares o en los que un archivo incluya una parte de otro?

Tengo un directorio con muchos archivos mezclados. Entre los archivos, hay diferentes versiones de archivos y los nombres de los archivos están desordenados.

Respuesta1

¿Qué tal usar diff para comparar dos archivos, contar las líneas de texto diferenciado con 'wc -l' y luego contar las líneas reales en ambos archivos comparados? Si las líneas de diferencias son significativamente más pequeñas que las líneas reales de los archivos, entonces es seguro decir que los archivos son más similares que no. Eso es al menos un comienzo.

Esta es la idea de lo que estarías haciendo.NOTA:esto supone que estás tratando con archivos no binarios

Primero desea obtener el recuento de líneas de cada archivo:

$ cat <file1> | wc -l
24
$ cat <file2> | wc -l
18
$ cat <file3> | wc -l
25
$ cat <file4> | wc -l
4

Luego, recorra el directorio, compare los archivos con 'diff' y cuente las diferencias de línea:

$ diff <file1> <file2> | wc -l 
47
$ diff -ib <file1> <file3>  | wc -l
12
$ diff -ib <file1> <file4>  | wc -l
34

Esa es la idea básica.

El siguiente script hará esto por usted (opera en el directorio actual) y se repetirá cada vez que la diferencia sea menor que la cantidad de líneas en cualquiera de los archivos. Puede modificar esto para ser más cauteloso y solo encontrar coincidencias para recuentos de líneas de diferencias que sean más de 10 o menos que los números de línea de cualquiera de los archivos.

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 dije, no es nada especial y podría simplificarse mucho, pero lo estoy haciendo sobre la marcha. Resultaría algo como esto (dado el ejemplo del archivo de prueba anterior).

SIMILAR: <file1> [lines: 24] - <file3> [lines: 25] - # lines different: 12
SIMILAR: <file3> [lines: 25] - <file1> [lines: 24] - # lines different: 12

información relacionada