• Jueves 28 de Marzo de 2024, 16:23

Autor Tema:  Eliminar archivos duplicados del sistema  (Leído 4155 veces)

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Eliminar archivos duplicados del sistema
« en: Sábado 16 de Mayo de 2009, 20:09 »
0
Código: Python
  1. import hashlib, sys, os
  2.  
  3. #Esta funcion detectara el hash MD5 del archivo
  4. def sabersiya(archivo):
  5. ....archi = open(archivo)
  6. ....cabeceramd5 = hashlib.md5(archi.read()).hexdigest()
  7. ....archi.close()
  8. ....return cabeceramd5
  9.  
  10. todo = os.walk(sys.argv[1])
  11. #Diccionario para guardar los datos
  12. dic = {}
  13. #Esta variable sera el nombre de los indices
  14. x = 0
  15. #Recorremos el arbol de directorios
  16. #todo = os.walk('.')
  17. for path, dirname, filename in todo:
  18. ....for x in filename:
  19. ........var = '%s/%s' % (path, x)
  20. ........dic[var] = sabersiya(var)
  21. ........
  22. #Verificamos que sea el mismo hash, pero diferente clave
  23. for h in dic:
  24. ....for hh in dic:
  25. ........if dic.get(h) == dic.get(hh) and h != hh:
  26. ............#print '%s/%s --> %s/%s' % (h, dic.get(h),hh, dic.get(hh))
  27. ............try:
  28. ................#Eliminamos el archivo
  29. ................os.remove('%s' % (hh))
  30. ................print 'El archivo eliminado fue %s' % (hh)
  31. ............except:
  32. ................pass
  33.  
El pasado son solo recuerdos, el futuro son solo sueños

orosius1000

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Eliminar archivos duplicados del sistema
« Respuesta #1 en: Sábado 26 de Septiembre de 2009, 18:34 »
0
Hola edo!
Oye, para que sirve ese codigo¿?

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Eliminar archivos duplicados del sistema
« Respuesta #2 en: Jueves 2 de Agosto de 2012, 20:16 »
0
hola,

se que estoy rescatando un tema antiguo, pero cada vez que busco código para "eliminar archivos duplicados" en python me sale este programa.

que ha sido diseminado por la red y se hace referencia a el en distintos blogs y foros.

pues bien, el código básicamente pretende eliminar archivos duplicados y dejar una sola copia de cada archivo, y básicamente "Falla" en el propósito para el que fue creado. Esto es uno de esos errores lógicos de los que tanto se habla en los libros, uno de esos que no tira advertencias y que hace que el resultado del programa no cumpla con el cometido para el que fue creado.

en primer lugar se define una función que devuelve el hash md5 de cada uno de los archivos en el árbol de directorios, luego se crea un diccionario con los nombres de los archivos como claves y con las sumas md5 como valores, y ahora se pretende comparar los archivos unos con otros y borrar los que tengan el mismo valor pero distinta clave. Y es aquí donde esta el error, estamos comparando las entradas del diccionario con 2 bucles anidados, y estamos borrando archivos en el árbol de directorios, las entradas del diccionario no se borran, así que básicamente un archivo que haya sido borrado mantiene su entrada en el diccionario y tarde o temprano se comparara con otro de los duplicados, dando como resultado el borrado de este también.

en resumen, lo que pasará es que se borrarán "todos" los archivos, incluso los originales
« última modificación: Jueves 2 de Agosto de 2012, 21:29 por nachete_222 »

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re:Eliminar archivos duplicados del sistema
« Respuesta #3 en: Sábado 4 de Agosto de 2012, 18:51 »
0
Miércoles, no me había fijado :losiento: lo arreglaré y lo volveré a publicar.

PD. En qué blogs y foros lo has visto, no puedo creer que uno de mis código esté difundido por Internet :kicking:
El pasado son solo recuerdos, el futuro son solo sueños

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Eliminar archivos duplicados del sistema
« Respuesta #4 en: Sábado 4 de Agosto de 2012, 19:31 »
0
aquí hay uno:

Código: [Seleccionar]
http://radicalpython.blogspot.com.es/2009/05/eliminar-archivos-duplicados-en-el-pc.html

RadicalEd

  • Moderador
  • ******
  • Mensajes: 2430
  • Nacionalidad: co
    • Ver Perfil
Re:Eliminar archivos duplicados del sistema
« Respuesta #5 en: Domingo 5 de Agosto de 2012, 02:05 »
0
Ese es mi ex-blog :P
El pasado son solo recuerdos, el futuro son solo sueños

nachete_222

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re:Eliminar archivos duplicados del sistema
« Respuesta #6 en: Martes 4 de Septiembre de 2012, 01:10 »
0
Hola,

me gustaría hacer un pequeño aporte mas.

Me rondaba la cabeza el tema y no sabia por que, pero tenia en mente que la función sabersiya() no producía un hash md5 correcto al menos en windows, así que lo comprobé, las opciones por defecto al abrir archivos son 'lectura' y 'modo texto', y ya sabemos todos que microsoft es muy particular a la hora de interpretar los saltos de línea, utilizando dos caracteres en lugar de uno solo, el famoso 'retorno de carro' y el 'salto de línea', si abrimos dando las opciones de lectura y modo binario 'rb', conseguimos un código mas portable y mas independiente de la plataforma.

al abrir el archivo se hace con opciones por defecto.
archi = open(archivo) # Esto produce un hash incorrecto

debería abrirse con las opciones 'rb'
archi = open(archivo, 'rb') # Esto produce el hash correcto

aunque yo trabajo en una maquina con linux, la comprobación la he hecho en una maquina windows, no se si en linux pasara lo mismo...
aquí dejo la comprobación:

Código: [Seleccionar]
C:\Documents and Settings\n\Programacion\Python>md5deep resultados.txt
679b1f3244e3d285bf134ff0de4770fd  C:\Documents and Settings\n\Programacion\Python\resultados.txt

C:\Documents and Settings\n\Programacion\Python>Python
Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win 32
Type "help", "copyright", "credits" or "license" for more information.

>>> import hashlib

>>> def sabersiya(archivo):
...    archi = open(archivo)
...    cabeceramd5 = hashlib.md5(archi.read()).hexdigest()
...    archi.close()
...    return cabeceramd5
...
>>> sabersiya('resultados.txt')
'88e75f1675fba32f982f3ce11eb29d5c'

>>> def sabersiya2(archivo):
...    archi = open(archivo, 'rb')
...    cabeceramd5 = hashlib.md5(archi.read()).hexdigest()
...    archi.close()
...    return cabeceramd5
...
>>> sabersiya2('resultados.txt')
'679b1f3244e3d285bf134ff0de4770fd'

Para empezar he comprobado el hash con una utilidad conocida 'Md5deep' sobre un archivo
luego he definido la función sabersiya() y he comprobado el resultado, como se puede ver es erróneo, para finalizar he definido la función sabersiya2() con la opción de apertura modificada y la he comprobado sobre el mismo 'sufrido' archivo que ha hecho de conejillo de indias y en esta ocasión se ve que el resultado es correcto.

Un saludo,
Nacho
« última modificación: Martes 4 de Septiembre de 2012, 02:42 por nachete_222 »