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) :
import os import md5 import sys global arEstrutura path = sys.argv[1] arEstrutura = {} arDuplicados = {} def lerEstrutura(dir): if os.path.isdir(dir): dirAtual = os.listdir(dir) for item in dirAtual: atual=os.path.join(dir,item) if os.access(atual,os.R_OK): if (os.path.isfile(atual)): if os.path.splitext(atual.lower())[1] == '.jpg': global arEstrutura f = open(atual,'r') dump = f.read() m = md5.new(dump) f.close() try: arEstrutura[m.digest()].append(atual) except KeyError: arEstrutura[m.digest()]=[atual] else: lerEstrutura(atual) else: print "You don't have permission: "+atual else: print "Not dir: "+dir def compararEstrutura(): global arEstrutura for md5 in arEstrutura: try: if arEstrutura[md5][1]: for duplicado in arEstrutura[md5]: global arDuplicados try: arDuplicados[md5].append(duplicado) except KeyError: arDuplicados[md5]=[duplicado] except IndexError: pass lerEstrutura(path) compararEstrutura() for arquivos in arDuplicados: print '----------------------------------' for duplicado in arDuplicados[arquivos]: print duplicado print '----------------------------------'
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.
Subscribe
Follow comments by subscribing to the FileDiff - encontrando arquivos duplicados Comments RSS feed.