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