1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

md5-Summen

Discussion in 'Linux-Distributionen' started by bennokue, Aug 31, 2005.

Thread Status:
Not open for further replies.
  1. bennokue

    bennokue Byte

    An alle die mich kennen eine Vorbemerkung: Mir ist schon wieder ein PC kaputtgegangen! :rolleyes:

    Ja, OK! Mir ist also ein PC "kaputtgegangen", bzw. ist total "zerbenutzt" und zugemüllt. Als Mensch der sich nicht damit abfinden will, bei jedem Einschalten fünf Minuten mit der Maus zu wackeln weil er sich sonst aufhängt sagte ich mir: SCHLUSS!! Neuinstallation!!


    Eine kleine Einschränkung habe ich: Ich habe noch wichtige Daten drauf, ziemlich viele sogar, von denen keine Sicherungskopie existiert. Weil das WIndows (XP) nicht mehr ging bootete ich mit Knoppix, das auch mir, dem Linux-Neuling gut verständlich ist: Bis zu einem bestimmten Grad.

    Ich möchte eine MD5-Prüfsummendatei der Dateien eines Ordners und der Dateien aller Unterordner machen. Wie kann ich das bewerkstelligen?

    Im Internet habe ich auch schon gesucht und gefunden, ging dann allerdings im Linux-Technik-Slang absolut unter. :(
     
  2. Affirmation

    Affirmation Kbyte

    Das geht (nicht rekursiv) relativ einfach via:

    md5sum <Verzeichnis>/*

    Also zum Beispiel: md5sum /boot/*

    Rekursiv ist das etwas komplexer via:
    find <Verzeichnis> -type f -print0 | xargs -0 md5sum

    Also zum Beispiel:
    find /boot -type f -print0 | xargs -0 md5sum


    In eine Datei bekommst du das dann halt durch umlenken in eine Datei via: ">> dateiname"

    Also hier zum Beispiel:
    find /boot -type f -print0 | xargs -0 md5sum >> dateiname
     
  3. bennokue

    bennokue Byte

    Super, soweit funktioniert es schon, danke!

    Nur noch eine kleine Unschönheit:
    Bis jetzt steht dann in der Ausgabedatei der Pfad drin. Ginge es nicht auch mit einem relativen Pfad? Wenn ich nach find "." schreibe, ist die Ausgabedatei leer!
     
  4. Affirmation

    Affirmation Kbyte

    Das ist ein wenig tricky - du musst nämlich md5sum schon den kompletten Pfad geben, sonst findet der die Dateien nicht. Und md5sum gibt eben immer Summe + Pfad zurück.
    Entsprechend musst du den Output direkt oder indirekt parsen - also entweder zur Laufzeit vor dem Speichern oder eben nach dem gesamten Durchlauf.

    Mal der sofortige Weg (wobei die sich prinzipiell gleichen):
    find <Verzeichnis> -type f -print0 | xargs -0 md5sum | sed 's|<Verzeichnis>|..|g' >> dateiname

    Das ersetzt das Verzeichnis das du angibst durch ".." in der Ausgabe - dann wirkt das relativ ;)

    Beachte hier die sed-Syntax für das Ersetzen einer Zeichenketten durch eine andere (insbesondere das Trennzeichen zwischen den Zeichenketten):
    sed 's|<Suchmuster>|<Ersatzstring>|g' <Eingabestring>

    Das "|" ist durch ein beliebiges anderes Zeichen ersetzbar - normalerweise würde man hier / nehmen - nur das ist hier schlecht, weil das auch in Pfaden auftaucht.

    Mal am Beispiel:
    Du nutzt als Pfad /boot:
    find /boot -type f -print0 | xargs -0 md5sum | sed 's|/boot|..|g' >> dateiname
     
  5. bennokue

    bennokue Byte

    Ich bitte um Vergebung - es ging jetzt doch mit dem Punkt! :rolleyes:
    ABER schon wieder eine Frage! Einer der Ordner heißt "30.04.2003". Wenn ich den einsetze (egal ob mit " oder \ oder usw) heißt es immer, dass er nicht gefunden wird!!!


    Zweitens:
    Es sind sehr viele Ordner. Kann ich das irgendwi in eine Stapelverarbeitung reintun? Also dass ich z.B. eine Ordnerliste in eine Datei schreibe und den Befehl immer außen rum hinkopiere - wie startet man die denn dann und was muss man beachten?
     
  6. Affirmation

    Affirmation Kbyte

    Du musst keine Escape-Zeichen für die Pfade bauen, nur weil da . drin sind.
    Mal so als Beispiel hier: gesuchter Ordner sei mal /home/oetzi/Desktop/30.04.2003

    Code:
    find /home/oetzi/Desktop/30.04.2003/ -type f -print0 | xargs -0 md5sum | sed 's|/home/oetzi/Desktop/30.04.2003|..|g' >> dateiname
    Dann steht das ohne Fehlermeldung alles fein in der Datei "dateiname".

    Dein Weg mit dem . könnte hier der Fehler sein. Ich weiss aber nicht, was du da machst - daher kann ich das auch nicht einschätzen :)

    Ok, dann mal ein Script. Speichere das unter einem beliebigen Dateinamen ab. Danach machst du es ausführbar (via Dateieigenschaften oder mit 'chmod 744 dateiname' auf der Konsole. Lege nun eine Datei an, die zeilenweise (!) legale (=vollständige) Pfade enthält, an.

    Danach führst du es auf der Konsole aus.

    Das Script macht folgendes:
    1. Es liest aus einer Datei, die du (mit möglichem Pfad) als 1. Paramter übergibst zeilenweise (!) Pfade aus
    2. Es ermittelt dann rekursiv - ohne symbolische Links zu verfolgen - aus Dateien, die gefunden werden, die entsprechenden md5summen
    3. Es schreibt die Summen in die Datei, die du (mit möglichem Pfad) als 2. Parameter übergibst
    4. Diese Datei darf nicht existieren (siehe Quelltext, wenn du das nicht willst).
    5. Das jeweilige Verzeichnis wird vor dem jeweiligen Listing zur besseren Übersicht hinzugefügt (siehe Quelltext, wenn du das nicht willst).
    6. Das Script arbeitet ohne Probleme mit Leerzeichen und einigen Sonderzeichen zusammen. Du musst aber Pfade mit [, |, \ und $ meiden - da steigt das Script aus und zeigt dir keine Datei an ( [ und | ) bzw. ändert den Pfad nicht ($ und \). Die Dateinamen sind aber frei wählbar (nur \ wird als \\ in die Datei geschrieben - Escapezeichen eben).

    Code:
    #!/bin/bash
    if [ -z "$1" ]
    then
    	echo "Ermittelt die md5-Pruefsummen von Dateien in Pfaden, welcher aus einer Datei gelesen werden, und schreibt sie in eine Zieldatei"
      	echo "Usage: `basename $0` [Datei mit Pfaden] [Zieldatei]"
      	exit 0
    fi
    
    if [ -e "$1" ]
    then
    	if [ -z "$2" ]
    	then
    		echo "Bitte eine Zieldatei angeben!"
    		exit 1
    	fi
    
    # Die Zieldatei muss existieren.
    # Wenn das nicht gewünscht ist, dann sind folgende Varianten moeglich:
    # 
    # 1. Zieldatei muss nicht existieren (kann aber)
    # Folgende Zeilen löschen:
    # if [ ! -e "$2" ]
    # then
    # und weiter unten:
    # 	else 
    #		echo "Die Datei $2 existiert schon!"
    #		exit 1
    #	fi
    #
    # 2. Zieldatei muss zwingend existieren
    # if [ ! -e "$2" ] ersetzen durch:
    # if [ -e "$2" ]
    # und weiter unten:
    # echo "Die Datei $2 existiert schon!" ersetzen durch:
    # echo "Die Datei $2 existiert nicht!"
    
    	if [ ! -e "$2" ]
    	then
     		IFS=$'\n';
    		for i in `cat "$1"`
    		do
    			if [ -e "$i" ]; then
    
                                    # Die folgende Zeile schreibt eine neue Zeile sowie den Pfad in die Zieldatei, löschen wenn unerwünscht.
    				echo $'\n'"Pfad: $i" >> "$2"
    				find "$i" -type f -print0 | xargs -0 md5sum | sed 's|'"$i"'|..|g' >> "$2"
                            else 
                                    echo "Warnung: Pfad $i existiert nicht!"
    			fi
    		done
     		IFS=$' ';
    	else 
    		echo "Die Datei $2 existiert schon!"
    		exit 1
    	fi
    else 
    	echo "Die Pfaddatei $1 existiert nicht!"
    	exit 1
    fi
    
    exit 0
     
  7. bennokue

    bennokue Byte

    Nur um es für die Ewigkeit festzuhalten: Seit mittlerweile fast 10 Jahren komme ich regelmäßig wieder zurück zu diesem Posting, weil es einfach funktioniert wie ne Eins. :)

    Nur noch etwas ist hinzuzufügen: Wenn man zum Verifizieren das Tool EFCM verwendet, muss man in der Prüfsummendatei den String "<Space><Space>./" durch "<Space>*" ersetzen ("<Space>" stellt ein Leerzeichen dar). Kann man mit sed machen, oder mit einem Texteditor nach Belieben.

    Danke Affirmation! :)
     
Thread Status:
Not open for further replies.

Share This Page