BuscaPé, líder em comparação de preços na América Latina

FileDiff - encontrando arquivos duplicados

Posted by Mathias Grimm on agosto 17, 2008 in Python

File Diff

É isso ai galera, mais um artigo rapidinho, e surgiu de uma necessidade minha também.
Tenho varios backups no computador e tem muito arquivo que está em mais de 1 backup.
Fiz um programinha que identifica todos arquivos duplicados a partir de um diretório, no meu caso só fiz para arquivos jpg,
mas pode ser facilmente trocado por qq outro tipo, ou simplesmente retirar o if para que todos arquivos sejam verificados.
Tive um problema com isso, pois tinha uma iso de 9gb e não consegui fazer funcionar, talvez seja pela falta de experiência em python.

O funcionamento é o seguinte:
1 - Uma função recursiva que varre todos diretorios e arquivos a partir do caminho informado.
2 - Um dicionario (array para os programadores php) que contém uma lista (outro array, não associativo) que tem o índice igual ao md5 do arquivo, e a lista com os valores dos caminhos dos arquivos iguais.
3 - Imprimo somente as listas nas quais possuem mais de 1 arquivo.

Veja na imagem 1 que estou na pasta /home/mathias/py e o único arquivo que existe é o diff.py
imagem 1:

Agora vou criar 2 arquivos .jpg vazios
Imagem 2:

Agora com o comando python2.5 diff.py '/home/mathias/py' eu executo o programa. caso o python2.5 não existe pode utilizar o python.
/home/mathias/py é o diretório no qual vou fazer a pesquisa, coloque o diretório que desejar.
Veja que são mostrados os 2 arquivos que são idênticos em seu conteúdo mas tem nomes diferentes.
Imagem 3:

Aqui desviei a saída para um arquivo txt pois existiam muitos arquivos ,e só vou conferir outro dia,assim deixo guardado o arquivo.
Esse comando cat mostra o conteúdo do arquivo log.txt, é um comando do linux mesmo. O arquivo poderia ser aberto em qualquer editor de texto.
Imagem 4:

Nessa próxima imagem crio outros 2 arquivos e coloco o texto 'qqcoisa' dentro deles e em seguida rodo o diff.py novamente.
Perceba que os arquivos iguais ficam agrupados mostrando o caminho completo.
Imagem 5:

Segue a abaixo o código python (ou gathon) :

  1.  
  2. import os
  3. import md5
  4. import sys
  5.  
  6. global arEstrutura
  7.  
  8. path = sys.argv[1]
  9. arEstrutura = {}
  10. arDuplicados = {}
  11.  
  12. def lerEstrutura(dir):
  13. if os.path.isdir(dir):
  14. dirAtual = os.listdir(dir)
  15.  
  16. for item in dirAtual:
  17. atual=os.path.join(dir,item)
  18. if os.access(atual,os.R_OK):
  19. if (os.path.isfile(atual)):
  20. if os.path.splitext(atual.lower())[1] == '.jpg':
  21. global arEstrutura
  22. f = open(atual,'r')
  23. dump = f.read()
  24. m = md5.new(dump)
  25. f.close()
  26.  
  27. try:
  28. arEstrutura[m.digest()].append(atual)
  29. except KeyError:
  30. arEstrutura[m.digest()]=[atual]
  31. else:
  32. lerEstrutura(atual)
  33. else:
  34. print "You don't have permission: "+atual
  35. else:
  36. print "Not dir: "+dir
  37.  
  38. def compararEstrutura():
  39. global arEstrutura
  40.  
  41. for md5 in arEstrutura:
  42. try:
  43. if arEstrutura[md5][1]:
  44. for duplicado in arEstrutura[md5]:
  45. global arDuplicados
  46. try:
  47. arDuplicados[md5].append(duplicado)
  48. except KeyError:
  49. arDuplicados[md5]=[duplicado]
  50.  
  51. except IndexError:
  52. pass
  53.  
  54. lerEstrutura(path)
  55. compararEstrutura()
  56.  
  57. for arquivos in arDuplicados:
  58. print '----------------------------------'
  59.  
  60. for duplicado in arDuplicados[arquivos]:
  61. print duplicado
  62.  
  63. print '----------------------------------'
  64.  

Clique aqui para baixar o script e as imagens utilizadas nesse post

Agradeço a presença de todos e voltem sempre!
Abraço!

1 Comentário on FileDiff - encontrando arquivos duplicados

By Cley Randal on julho 2, 2010 at 7:31 pm

Ótimo post. Dá uns bons comandos Shell linux além de python.

Estou tentando fazer um programa para gerenciar arquivos em python (estou començando ainda) e estou tendo o mesmo problema que o seu. Não consigo obter o hash correto de arquivos grandes (testei em uma ISO de 4,1 GB).

Se alguém souber como ou onde tem o material, me mandem por e-mail.

Write a Comment on FileDiff - encontrando arquivos duplicados

Subscribe

Follow comments by subscribing to the FileDiff - encontrando arquivos duplicados Comments RSS feed.

More

Read more posts by Mathias Grimm

POSTGRESQL : Prepare X Query X COPY para importação de csv Redimensionamento de imagens em lote