Dieses Pythonscript vergleicht zwei Verzeichnisse und löscht doppelt vorhandene Dateien, wenn sich diese im gleichen Unterordner befinden.
Der Einsatz ist vorgesehen, wenn eine alte Verezichniskopie existiert (bspw. eine Datensicherung), die mit dem aktuellen Stand zusammengeführt werden soll, wobei der aktuelle Stand nicht mehr alle alten Daten enthält.
Gesteuert wird das Script über die zwei enthaltenen Variablen mainpath und scanpath. Der Löschvorgang betrifft die Dateien im Verzeichnis scanpath.
#!/usr/bin/python # -*- coding: utf-8 -*- import os, stat, random, hashlib mainpath = "/home/user1/Documents" scanpath = "/media/recovery/user1/Documents" def md5sumfile(filename): m = hashlib.md5() try: f = file(filename, 'rb') while True: d = f.read(8096) if not d: break m.update(d) except: return random.random() f.close() return m.hexdigest() def walkdir(toplevel, dirname = ""): if dirname.find("/.svn/") > -1: return entries = os.listdir(os.path.join(toplevel, dirname)) files = [] has_subdir = False for entry in entries: try: st = os.lstat(os.path.join(toplevel, dirname, entry)) except os.error: continue if stat.S_ISDIR(st.st_mode): walkdir(toplevel, os.path.join(dirname, entry)) has_subdir = True elif stat.S_ISREG(st.st_mode): files.append(os.path.join(dirname, entry)) #print "Checking %i files in %r" % (len(files), dirname) if len(files) == 0 and not has_subdir: print "Empty directory %r" % dirname for file in files: #print "Test: %r" % file filename1 = os.path.join(mainpath, file) filename2 = os.path.join(toplevel, file) if os.path.exists(filename1): #test for equal size size1 = os.path.getsize(filename1) size2 = os.path.getsize(filename2) if size1 == size2: #test for equal checksum md51 = md5sumfile(filename1) md52 = md5sumfile(filename2) if md51 == md52 : print "Removing %s" % filename2 try: os.remove(filename2) pass except os.error: continue else: print "File %r exists, but has different content" % file else: print "File %r exists, but has different content" % file walkdir(scanpath)
Dateien