SHA-Checksumme

Code-Stücke können hier veröffentlicht werden.
Antworten
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hier das aktuelle Skript: vielleicht nützt es ja noch jemand Anderem.

Code: Alles auswählen

#!/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


EDIT: by Damaskus
Script getrennt und in Codesnippets kopiert
Original Thread http://www.python-forum.de/topic-11650.html
BlackJack

Die Zeit lässt sich etwas einfacher in eine Zeichenkette umwandeln. Das ist ein Einzeiler:

Code: Alles auswählen

In [87]: time.strftime('%d.%m.%Y um %H Uhr %M und %S Sekunden.')
Out[87]: '17.08.2007 um 09 Uhr 16 und 43 Sekunden.'
use_opensue
User
Beiträge: 33
Registriert: Mittwoch 15. August 2007, 10:43

Hier die aktuelle Version:

Code: Alles auswählen

#!/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.
Antworten