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
Doubletten Finda
-
- 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)
Ich beschränke mich mal auf's stilistische, da habe ich vier Anmerkungen:akIra hat geschrieben: Über Comments würde ick mich freuen.
...
PS: mit Python 2.3a geschrieben, läuft leider nicht mit der 2.2x
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
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
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