Posso obter o oposto de 'diff -q' - correspondendo arquivos idênticos sem imprimir seu conteúdo

13

Eu tenho vários arquivos em um diretório e quero verificar se todos são exclusivos. Para simplificar, digamos que eu tenha três arquivos: foo.txt , bar.txt e baz.txt . Se eu executar este loop, vou verificar todos eles uns contra os outros:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

Para as centenas de arquivos com os quais quero lidar, isso ficaria muito ilegível; seria melhor listar os arquivos que fazem corresponder e, em seguida, posso examinar a lista rapidamente e verificar se os arquivos estão apenas correspondentes. Na manpage, eu teria pensado que a opção -s faria isso:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... no entanto, de fato, também imprime todo o conteúdo de qualquer arquivo diferente. Existe alguma maneira de suprimir esse comportamento, então eu só obtenho o comportamento acima?

Como alternativa, existe alguma outra ferramenta que possa realizar isso ?

    
por evilsoup 17.08.2013 / 13:40

4 respostas

7

Se você quiser apenas verificar se dois arquivos são idênticos ou não, use cmp . Para obter uma saída apenas para arquivos idênticos, você poderia usar

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff tenta produzir uma lista curta e legível das diferenças, e isso pode levar bastante tempo, então evite a sobrecarga se você não precisar dela.

    
por 17.08.2013 / 13:58
12

Isso deve funcionar:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

onde dir1 e dir2 são seus dois diretórios.

Se você quiser imprimir apenas os diretórios correspondentes de dir1 :

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

E, da mesma forma, se você quiser imprimir apenas os diretórios correspondentes de dir2 :

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'
    
por 03.03.2014 / 22:10
3

A ferramenta mais rápida escrita para esse propósito é fdupes (está disponível nos repositórios de pacotes do Fedora e Ubuntu e…)

Uso:

fdupes -r dir1 dir2
    
por 04.03.2014 / 00:56
2

Se você precisar encontrar arquivos idênticos em uma lista, primeiro classifique-os por tamanho, por exemplo, com

ls -S

depois, para cada grupo de arquivos de tamanho idêntico, execute md5sum para ver facilmente quais são os mesmos.

Para arquivos grandes, pode ser mais rápido para a primeira soma de verificação apenas um pequeno trecho de todo o arquivo:

dd if=file bs=512 count=1 | md5sum

e, em seguida, execute uma soma de verificação completa somente nos arquivos suspeitos.

    
por 17.08.2013 / 15:08

Tags