#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ----- Lizenz: GPL Version 3 -----
# ----- Skriptversion: 1.2 -----
# ----- Modulimporte: -----
import os
import sha
import time
# ----- Funktionsdefinitionen: -----
# blocksize = 1024 * 1024
def shasum(filepath, blocksize = 2048 * 2048):
'''Gibt die SHA-Checksumme (Hex-Digest) der angegebenen Datei zurück.
filepath: Pfad zu einer Datei; blocksize: Größe des Datenblocks, der
auf einmal bearbeitet werden soll.'''
h = sha.new()
f = open(os.path.normcase(filepath), "rb")
# normcase() vereinheitlicht die Pfade, unter Unix bleibt alles gleich,
# unter windows wird alles kleingeschrieben und Slashes(/) in
# Backshlashes(\) gewandelt.
try:
while True:
part = f.read(blocksize)
if not part:
break
h.update(part)
finally:
f.close()
return h.hexdigest()
def del_file(name):
'''Löscht die als Argument übergebene Datei.'''
if os.path.exists(name):
os.remove(name)
print name, ' gelöscht.'
print
def datums_zeit_kette():
'''Gibt die Datums und Zeit Zeichenkette, die an den Dateianfang
und das Dateiende der Inhaltsdatei geschrieben wird, zurück.'''
jahr = time.strftime('%Y')
monat = time.strftime('%m')
tag = time.strftime('%d')
stunde = time.strftime('%H')
minute = time.strftime('%M')
sekunde = time.strftime('%S')
return 'am %s.%s.%s um %s Uhr %s und %s Sekunden.\n' \
% (tag, monat, jahr, stunde, minute, sekunde)
# Skriptbeginn
print
# Ermitteln des aktuellen Arbeitsverzeichnisses
# cwd = ('c'urrent 'w'orking 'd'ir)
cwd = os.getcwd()
print 'aktuelles Arbeitsverzeichniss: %s' % cwd
print
index_datei = os.path.normcase(os.path.join(cwd, 'Inhaltsliste_1.x.txt'))
# join() verknüpft Pfade inteligent.
# alte Inhaltsdatei löschen
del_file(index_datei)
# neue Inhaltsdatei anlegen
f = open(index_datei, 'w')
start = 'Start ' + datums_zeit_kette() + '\n'
f.write(start)
f.write('Startverzeichniss: ' + cwd + '\n')
# os.walk() durchläuft alle Verzeichnisse unterhalb von 'cwd' und liefert in
# jedem Ordner 'root'=aktuelles Verzeichnis, 'ordner'=Liste aller Ordner im
# aktuellen Verzeichnis und 'dateien'=Liste aller Dateien im Verzeichniss
for root, ordner, dateien in os.walk(cwd):
# aktuelles Verzeichniss in die Datei schreiben
f.write('\n Verzeichniss: ' + root + '\n')
ordner.sort(reverse = False) # aufsteigend sortieren
dateien.sort(reverse = False)
for datei in dateien:
# Für jede Datei im aktuellen Verzeichnis die SHA-Summe berechnen
sha_summe = shasum(os.path.join(root, datei))
# Die berechnente SHA-Summe mit dem zugehörigen Dateinamen in die
# Datei schreiben
f.write(' SHA-Summe: ' + sha_summe + ' Datei: ' + datei + '\n')
for verzeichnis in ordner:
# Jeden Ordner im aktuellen Verzeichnis in die Datei schreiben
f.write(' Unterordner: ' + verzeichnis + '\n')
#
ende = '\nEnde ' + datums_zeit_kette()
f.write(ende)
f.close()
print 'Neue ', index_datei, 'geschrieben.'
# Skriptende
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ----- Lizenz: GPL Version 3 -----
# ----- Skriptversion: 1.5 -----
# ----- Modulimporte: -----
import os
import sha
import time
# ----- Funktionsdefinitionen: -----
# blocksize = 1024 * 1024
def shasum(filepath, blocksize = 2048 * 2048):
'''Gibt die SHA-Checksumme (Hex-Digest) der angegebenen Datei zurück.
filepath: Pfad zu einer Datei; blocksize: Größe des Datenblocks, der
auf einmal bearbeitet werden soll.'''
h = sha.new()
f = open(os.path.normcase(filepath), "rb")
# normcase() vereinheitlicht die Pfade, unter Unix bleibt alles gleich,
# unter windows wird alles kleingeschrieben und Slashes(/) in
# Backshlashes(\) gewandelt.
try:
while True:
part = f.read(blocksize)
if not part:
break
h.update(part)
finally:
f.close()
return h.hexdigest()
def del_file(name):
'''Löscht die als Argument übergebene Datei.'''
if os.path.exists(name):
os.remove(name)
print name, ' gelöscht.'
print
def datums_zeit_kette():
'''Gibt die Datums und Zeit Zeichenkette, die an den Dateianfang
und das Dateiende der Inhaltsdatei geschrieben wird, zurück.'''
return time.strftime('am %d.%m.%Y um %H Uhr %M und %S Sekunden.\n')
# Skriptbeginn
print
# Ermitteln des aktuellen Arbeitsverzeichnisses
# cwd = ('c'urrent 'w'orking 'd'ir)
cwd = os.getcwd()
print 'aktuelles Arbeitsverzeichniss: %s' % cwd
print
index_datei = os.path.normcase(os.path.join(cwd, 'Inhaltsliste_1.x.txt'))
# join() verknüpft Pfade inteligent.
# alte Inhaltsdatei löschen
del_file(index_datei)
# neue Inhaltsdatei anlegen
f = open(index_datei, 'w')
start = 'Start ' + datums_zeit_kette() + '\n'
f.write(start)
f.write('Startverzeichniss: ' + cwd + '\n')
# os.walk() durchläuft alle Verzeichnisse unterhalb von 'cwd' und liefert in
# jedem Ordner 'root'=aktuelles Verzeichnis, 'ordner'=Liste aller Ordner im
# aktuellen Verzeichnis und 'dateien'=Liste aller Dateien im Verzeichniss
for root, ordner, dateien in os.walk(cwd):
print 'Bearbeite Verzeichniss: %s\n' % root
# aktuelles Verzeichniss in die Datei schreiben
f.write('\n Verzeichniss: ' + root + '\n')
ordner.sort(reverse = False) # aufsteigend sortieren
dateien.sort(reverse = False)
for datei in dateien:
if os.path.isfile(os.path.join(root, datei)):
if os.path.join(root, datei) == os.path.realpath(os.path.join(root, datei)):
# Wenn obige Bedingung zutrifft, dann ist dies kein Link in einen anderen Ordner
print ' Bearbeite Datei: %s' % datei
# Für jede Datei im aktuellen Verzeichnis die SHA-Summe berechnen
sha_summe = shasum(os.path.join(root, datei))
# Die berechnente SHA-Summe mit dem zugehörigen Dateinamen in die
# Datei schreiben
f.write(' SHA-Summe: ' + sha_summe + ' Datei: ' + datei + '\n')
else:
print ' Bearbeite Link: %s' % datei
f.write(' Datei: ' + datei + ' ist ein Link!\n')
else:
print 'Folgender Dateieintrag konnte nicht verarbeitet werden: %s' % datei
for verzeichnis in ordner:
if os.path.isdir(os.path.join(root, verzeichnis)):
# Jeden Ordner im aktuellen Verzeichnis in die Datei schreiben
f.write(' Unterordner: ' + verzeichnis )
if os.path.islink(os.path.join(root, verzeichnis)):
f.write(' (ist Link.)\n')
else:
f.write('\n')
else:
print 'Folgender Ordnereintrag konnte nicht verarbeitet werden: %s' % verzeichnis
print '\n'
#
ende = '\nEnde ' + datums_zeit_kette()
f.write(ende)
f.close()
print 'Neue ', index_datei, 'geschrieben.'
print
# Skriptende
Version 1.5 braucht um 17864 Dateien in 857 (Unter-)Ordnern mit einer Größe von 26,1 GB zu verarbeiten 16 Minuten.