Compare os arquivos de uma lista

2

Eu tenho uma lista de arquivos (< 10) como saída de algum comando. Por exemplo:

$ find foo* -name bar*Test.groovy

foofoo/foo-tasks/src/test/groovy/foo_main/store/barEarthTest.groovy
foo-co/foo-tasks/src/test/groovy/foo_main/store/barMercuryTest.groovy
foo_ba/foo-tasks/src/test/groovy/foo_main/store/barMarsTest.groovy
foo_tr/foo-tasks/src/test/groovy/foo_main/store/barMarsTest.groovy
foo_P1/foo-tasks/src/test/groovy/foo_main/store/barJupiterTest.groovy
foo_P2/foo-tasks/src/test/groovy/foo_main/store/barTatooineTest.groovy

Gostaria de saber quais desses arquivos são idênticos e quais são diferentes. Eu não me importo com a diferença exata.

Qual é a maneira de obter essas informações de forma mais conveniente?

    
por Loom 26.01.2018 / 10:38

6 respostas

5

Existem vários códigos que fazem muito deste trabalho para você, por exemplo: fdupes jdupes rdfind duff

Há alguns anos, publiquei execuções de comparação de fdupes e rdfind em link

Aqui estão alguns detalhes sobre esses 4:

fdupes  finds duplicate files in a given set of directories (man)
Path    : /usr/bin/fdupes
Version : 1.51
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Help    : probably available with -h,--help
Repo    : Debian 8.9 (jessie) 
Home    : http://code.google.com/p/fdupes/ (pm)

jdupes  finds and performs actions upon duplicate files (man)
Path    : ~/executable/jdupes
Version : 1.5.1 (2016-11-01)
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Home    : https://github.com/jbruchon/jdupes (doc)

rdfind  finds duplicate files (man)
Path    : /usr/bin/rdfind
Version : 1.3.4
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Repo    : Debian 8.9 (jessie) 
Home    : http://rdfind.pauldreik.se/ (pm)

duff    duplicate file finder (man)
Path    : /usr/bin/duff
Version : 0.5.2
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS ...)
Repo    : Debian 8.9 (jessie) 
Home    : http://duff.sourceforge.net/ (pm)

Bes deseja ... felicidades, drl

    
por 26.01.2018 / 14:43
3

Você poderia fazer:

find foo* -name 'bar*Test.groovy' -type f -exec cksum {} + | sort

(assumindo que os caminhos de arquivo não contenham caracteres de nova linha), o que lhe daria uma soma de verificação (e tamanho) para cada arquivo, permitindo que você veja facilmente quais são os mesmos.

Você pode substituir cksum por md5sum / shasum / sha512sum / sha3sum , se disponível, e se preocupar com possíveis colisões de soma de verificação.

    
por 26.01.2018 / 14:06
3

Use o valor de retorno de

diff file1 file2 >/dev/null

porque retorna zero quando os arquivos são iguais e diferentes de zero quando os arquivos são diferentes.

Compare os arquivos em dois for ciclos aninhados. Algo como:

for file1 in $(COMMAND)
do
    for file2 in $(COMMAND)
    do
        if ! diff "${file1}" "${file2}" > /dev/null 2>&1
        then
            echo "${file1} and ${file2} differ"
        fi
    done
done

Ou, como Stéphane Chazelas sugeriu, você pode simplificá-lo:

for file1 in $(COMMAND)
do
    for file2 in $(COMMAND)
    do
        diff -q "${file1}" "${file2}"
    done
done

como diff -q imprime a mensagem da primeira abordagem em si.

    
por 26.01.2018 / 10:53
1

Como você não está interessado em saber quais são as diferenças, e quer que todos os arquivos sejam comparados um contra o outro, o método mais eficiente computacionalmente (veja O-notação ) será executar um único md5sum action em cada arquivo, classifique a saída pelo md5sum e marque duplicatas, que serão consecutivas.

find foo* -name bar*Test.groovy | md5sum | sort | \ awk 'key==$1{print file " is identical to "$2}{key=$1;file=$2}'

    
por 26.01.2018 / 16:57
0

Instale o pacote fdupes usando abaixo de yum install fdupes*

Em seguida, use o comando abaixo para encontrar os arquivos idênticos ou arquivos duplicados, ou seja, os arquivos que possuem o mesmo conteúdo

fdupes path

No caminho atual, ele exibirá todos os arquivos idênticos ou duplicados

    
por 26.01.2018 / 16:26
0

Use rmlint e canalize os resultados da pesquisa:

find foo* -name "bar*Test.groovy" | rmlint -T duplicates -
    
por 08.02.2018 / 11:45