Script python para descubrir archivos duplicados

Por razones ajenas a mi voluntad, tuve que instalar el Windows 8.1 en mi PC, y para hacer una instalación dual con Debian y Windows, tuve que realizar una minuciosa revisión de los archivos repetidos o duplicados en mis discos.

Existen muchos programas ya creados, pero mi interés era tener control sobre qué borrar y qué no borrar, así que decidí hacer el pequeño script, sencillo y quizás un poco tosco pero bien útil, me funcionó y cumplió el objetivo.

Acá dejo el código:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys, re
from os import walk
from datetime import datetime, date, timedelta
import filecmp

bas_file = []
mir_file = []
emp_file = []
sem_file = []
path_file = ''

sem_count = 0
emp_count = 0

path_search = raw_input('Inserte ruta absoluta de búsqueda: ')
result_file = path_search.replace('/','_')
result_w = open(r'/tmp/'+result_file+'.csv', 'w')
result_r = open(r'/tmp/'+result_file+'.csv', 'r')

if os.path.exists(path_search):
    for d in walk(path_search):
        if not re.match('.*\..*',d[0]):
            for f in d[2]:
                a_data = os.stat(d[0]+'/'+f)
                path_file = d[0]+'/'+f
                if not path_file in bas_file:
                    if a_data.st_size > 0:
                        bas_file.append(path_file)
                    else:
                        emp_file.append(path_file)
                        emp_count += 1
    
    mir_file = bas_file
    for f in bas_file:
        for m in mir_file:
            if f <> m and filecmp.cmp(f,m) and not m+','+f in sem_file:
                sem_file.append(f+','+m)
                sem_count += 1
    
    result_w.write('Son '+str(sem_count)+' archivos iguales\n')
    for s in sem_file:
        result_w.write(s+'\n')
    
    result_w.write('\nSon '+str(emp_count)+' archivos vacíos\n')
    for e in emp_file:
        result_w.write(e+'\n')
    
    result_w.close()
    print 'Resultado creado en: /tmp/'+result_file+'.csv'
    
else:
    print 'No existe ruta absoluta de búsqueda'

Básicamente crea un arreglo con todos los archivos existentes, luego, va generando un segundo arreglo para posteriormente comparar ya directamente el archivo físico. Al finalizar la comparación, crea un archivo .csv en el directorio /tmp

Lo interesante es que descubre cualquier tipo de archivo, no importa el formato o la forma del archivo, detecta cuáles son similares y los lista en el archivo .csv

Lo llamé mirror_file y lo copié en /usr/local/bin/, le di los respectivos permisos de ejecución y simplemente desde cualquier directorio ejecuto: mirror_file

También un detalle que debo corregir, es el tiempo de ejecución, si se realiza una búsqueda dentro de un directorio muy lleno de archivos, tardará mucho corriendo. Por otro lado también, por ahora, no detecta cuáles archivos son enlaces simbólicos, por lo que siempre dará un error si consigue un enlace simbólico roto.

Advertisements

About felixurbina

Humano con todos los defectos y virtudes que vienen de fábrica.
This entry was posted in Python. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s