Eu tenho vários arquivos em um diretório e quero verificar se todos são únicos. Para simplificar, vamos dizer que tenho três arquivos: foo.txt
, bar.txt
e baz.txt
. Se eu executar esse loop, verificarei todos eles um contra o outro:
$ 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 se tornaria bastante ilegível; seria melhor para listar os arquivos que fazem jogo, e então eu posso olhar sobre a lista rapidamente e certifique-se de que apenas os arquivos estão se combinando. Na página de manual, eu teria pensado que a -s
opção conseguiria 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, na verdade, ele também imprime todo o conteúdo de qualquer arquivo que seja diferente. Existe alguma maneira de suprimir esse comportamento, então eu só recebo o comportamento acima?
Como alternativa, existe alguma outra ferramenta que pode fazer isso ?
diff -qrs
quando comparando arquivos grandes (silencioso suprime a impressão de diferenças)A ferramenta mais rápida escrita para esse fim é fdupes (está disponível nos repositórios de pacotes do Fedora e Ubuntu e…)
Uso:
fonte
Se você precisar encontrar arquivos idênticos em uma lista, primeiro os classifique por tamanho, por exemplo, com
depois, para cada grupo de arquivos de tamanhos idênticos, execute
md5sum
-os para ver facilmente quais são idênticos a quais.Para arquivos grandes, pode ser mais rápido primeiro adicionar apenas um pequeno pedaço do arquivo inteiro:
e execute uma soma de verificação completa apenas em arquivos suspeitos.
fonte