Doubletten Finda

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
akIra
User
Beiträge: 49
Registriert: Dienstag 3. Dezember 2002, 12:05
Wohnort: Berlin
Kontaktdaten:

Salut,
ne kleines Script um in Verzeichnissen doppelte Dateien zu finden.
Ich brauchte das für meine MpIx, aber sowas kann man vielleicht öfters ma gebrauchen [ihr Netzjunkies : ]
Über Comments würde ick mich freuen.

Ciao,
aki

PS: mit Python 2.3a geschrieben, läuft leider nicht mit der 2.2x

http://akira.50g.com/files/_python/df.py
RicmanX
User
Beiträge: 69
Registriert: Donnerstag 29. August 2002, 17:10
Wohnort: Erfurt
Kontaktdaten:

Code: Alles auswählen

#Program DoubleFinda
#by akIra 2003/02/17

#ToDo:
# - Zeitformat 2d

Version = '0.2b'
import md5, os.path, os, time, sys

#This is the Check-Class for the CHECK-Command
class cCheck:
	def Start(self, Home):
		Home = os.path.normpath(Home)
		if os.path.isdir(Home) == 0:	print "\nUnknown Directory !\n"
		else: 
                        return self.Go(Home)
	
	def Go(self, Home):
		self.ctDir=0
		self.Names=[]
		os.path.walk(Home, self.inDir, 0)
		t = len(self.Names)
		if t==0:
			print "\nCould not find any file(s) !"
		else:
			print "\nSuccessful passed" , t, "Files in", self.ctDir, "Directorys !\n"
			self.Stat = 0
                        if self.MD5_Get() == 1:
				print "\nCould not find any file(s) !"
			else:
				 return self.MD5_Compare()
                                        
	def MD5_Get(self):
		self.MD5 = []
		ct = 0
		print "Creating MD5-Sums...\n"
                a = time.clock()
		for x in self.Names:
			try:
				f = open(x, 'rb')
				self.MD5.append(md5.new(f.read()).hexdigest())
				f.close()
				ct = ct + 1
                                sys.stdout.write(".")
			except IOError:
                                self.Names.remove(x)
				print "\nIO-Error ->",x
				pass
                if len(self.Names) > 0:
                        print "\n\nMD5-Sums created in", int(time.clock()), "seconds !"
                else:
                        return 1
	
	def inDir(self, arg, dirName, fileNames):
		self.ctDir=self.ctDir+1
		for x in fileNames:
			s = os.path.join(dirName,x)
			if os.path.isfile(s)==1:
				self.Names.append(s)
		print "Passing: ", dirName

	def MD5_Compare(self):
		Dbl = []
                bakName = ""
                bakMD5 = ""
                print "\nComparing MD5-Sums..."
                for x in self.MD5:  
                        if self.MD5.count(x) > 1:
                                print "\nDouble:", self.Names[self.MD5.index(x)], "is like"
                                bakName=self.Names[self.MD5.index(x)]
                                self.Names.remove(self.Names[self.MD5.index(x)])
                                self.MD5.remove(x)
                                while self.MD5.count(x) > 0:
                                        print "->",self.Names[self.MD5.index(x)]
                                        Dbl.append(self.Names[self.MD5.index(x)])
                                        self.Names.remove(self.Names[self.MD5.index(x)])
                                        self.MD5.remove(x)
                        else:
                                self.Names.remove(self.Names[self.MD5.index(x)])
                                self.MD5.remove(x)		
                if len(Dbl) == 0: print "\nNo double files found.\n"
                else: 
                        print
                        return Dbl

class cDouble:
        def __init__(self, dbl = None):
                self.Dbl = dbl
        
        def dblShow(self,cmd = None):
                print "\n"
                if not cmd:
                        for x in self.Dbl:
                                print x
                print "\n"
        
        def dblDel(self):
                for x in self.Dbl:
                        try:
                                print "Delete ->", x
                                os.remove(x)
                        except OSError:
                                print "IO-Error ->",x
                Dbl = []

        def dblSave(self, n = None):
                try:
                        f = open(n,'w')
                        for x in self.Dbl:
                                x = x + "\n"
                                f.write(x)
                        f.close()
                        print "\n",n,"saved !\n"
                except IOError:
                        print "\nInvalid filename !\n"
                        
def getCmd(x):
	if x[:5]=='check':
		if len(x) > 6:
                        RunCheck = cCheck()
                        k = RunCheck.Start(x[6:])
                        if len(k) > 0:
                                Double.Dbl=k
                        del RunCheck
                else:
                        print "\nMissing path !\n"
        else:
                if x[:4] == 'show':
                        if len(Double.Dbl) > 0:  Double.dblShow(x[5:])
                        else:  print "\nRun check first !\n"
                elif x == 'del' or x == 'delete':
                        if len(Double.Dbl) > 0: 
                                print "\nSure to delete files ?\n"
                                k = raw_input("> ")
                                if k == 'y' or k == 'yes' or k == 'j' or k == 'ja': Double.dblDel()
                        else:  print "\nRun check first !\n"
                elif x[:4] == 'save':
                        if len(Double.Dbl) > 0: 
                                if len(x[5:]) > 0:
                                        Double.dblSave(x[5:])
                                else:
                                        a = raw_input("\nDateiname: ")
                                        if len(a) > 0: Double.dblSave(a)
                        else:  print "\nRun check first !\n"
                else:  print "\nUnknown command:",x,"\n"
                                                                          
def Help():
        print "\nWelcome to the Double-Finder", Version, "!"
        print "I am a python-script which creates file-checksums (MD5).\n"
        print "Commands:"
        print "\tcheck DIR\tFind double files in DIR (within Subdirs)."
        print "\tshow\t\tShows the foundet files."
        print "\tsave FILE\tSave filenames of double files to FILE."
        print "\tdel\t\tDeletes the foundet double files [at own risk] !"
        print "\thelp\t\tCall this help (if it is :)."
        print "\tquit|exit\tTerminates Program.\n"
q = 'f'
Help()
Double = cDouble()
while 1:
	try:
                k = raw_input(">> ")
	except KeyboardInterrupt:
		print "\n\nGood bye !"
                break
	if k == 'q' or k =='quit' or k == 'exit':
		break
	elif not k:
		continue
	elif k=='-?' or k == '--help' or k == 'help':
                Help()
        else:
		getCmd(k)
	
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

akIra hat geschrieben: Über Comments würde ick mich freuen.
...
PS: mit Python 2.3a geschrieben, läuft leider nicht mit der 2.2x
Ich beschränke mich mal auf's stilistische, da habe ich vier Anmerkungen:

Du vermischst TABs und Spaces bei Einrückungen, das sollte man wirklich lassen. Die meisten empfehlen nur Spaces zu nehmen, manche nehmen auch TABs, aber keinesfalls beide mischen!

Wenn man mit Spaces einrückt, finde ich 8 pro Ebene stark übertrieben, aber das ist Geschmackssache. Ich empfinde 2 oder 4 als übersichtlicher.

Deine Zeilenenden sind auch nicht konsistent, mal CR+NL, mal nur eines davon. Mein Python-Interpreter wollte es auf Anhieb gar nicht fressen, da mußte ich erst Hand anlegen.

Bei so einem Skript sehe ich auf Anhieb keine Notwendigkeit, neue Features einer alpha-Version einzusetzen. Die meisten werden 2.3a noch gar nicht benutzen (ich übrigens auch nicht).

So, genug gemeckert, aber Du wolltest ja Feedback haben. ;-)

Viel Spaß beim Weitermachen

Jörg
akIra
User
Beiträge: 49
Registriert: Dienstag 3. Dezember 2002, 12:05
Wohnort: Berlin
Kontaktdaten:

Salut Joerg,
ersma danke für dein Comment, ick stehe noch realativ am Anfang mit Python,
so verzeihe meine stilistischen Fehler.

Das mit den Tabs+Spaces wurde mir auch schon nahegelegt.

Die unterschiedlichen TabSpaces ergeben sich aus zwei unterschiedlich konfigurierten Editoren.

Die 2.3a war nur testweise installiert und jetzt läßt es sich nichtmehr unter 2.2x kompilieren, wird aber nur an den charage-returns liegen.

So merci,
akI
Antworten