Doppelsuche

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)