Generieren Sie eine MD5-Prüfsumme für alle Dateien in einem Verzeichnis

75

Ich möchte eine MD5-Prüfsummenliste für alle Dateien in einem Verzeichnis erstellen.

Ich will cat filename | md5sum > ouptput.txt. Ich möchte dies in einem Schritt für alle Dateien in meinem Verzeichnis tun.

Jede Hilfe wäre toll.

Walter Wayne Leutwyler
quelle
Wie finde ich die MD5-Summe (Prüfsumme) einer bestimmten Sicherungsdatei? -Wie soll mein Skript aussehen -was ist der Befehl dafür

Antworten:

110

Sie können md5summehrere Dateinamen oder Bash-Erweiterungen übergeben:

$ md5sum * > checklist.chk  # generates a list of checksums for any file that matches *
$ md5sum -c checklist.chk   # runs through the list to check them
cron: OK
database.sqlite3: OK
fabfile.py: OK
fabfile.pyc: OK
manage.py: OK
nginx.conf: OK
uwsgi.ini: OK

Wenn Sie Lust auf etwas haben, können Sie beispielsweise finddie Dateien aufreißen und filtern sowie rekursiv arbeiten:

find -type f -exec md5sum "{}" + > checklist.chk
Oli
quelle
1
♦ wie man das Obige benutzt, md5sumum die Dateien in Unterverzeichnissen zu bekommen, wobei das obige md5sum *Emittieren in die Unterverzeichnisebene geht, indem man sagt ... ist ein Verzeichnis
Kasun Siyambalapitiya
Tut mir leid, dass ich gefragt habe, indem ich ausgeführt habe find -type f -exec md5sum '{}' +und "find -type f -exec md5sum" {} "angegeben habe. Ich habe es geschafft. Danke :)
Kasun Siyambalapitiya
Ich bevorzuge das Aussehen dieser Ausgabe mehr:openssl md5 * > checklist.txt
Ashley
1
Wenn Sie eine Shell verwenden, die gerne **rekursiv ausgewertet wird (wie zsh), ist dies noch einfacher:md5sum **/* 2>/dev/null
Joost
12

Ein großartiges Programm zum Erstellen / Überprüfen von Prüfsummen ist Rhash. Es werden sogar SFV-kompatible Dateien erstellt und auch überprüft.

Es unterstützt MD4, MD5, SHA1, SHA512, CRC32 und viele andere.

Darüber hinaus kann es rekursives Erstellen (Option -r) wie md5deep oder sha1deep ausführen.

Zu guter Letzt können Sie die Ausgabe der Prüfsummendatei formatieren. zum Beispiel:

rhash --md5 -p '%h,%p\n' -r /home/

Gibt eine CSV-Datei mit dem vollständigen Pfad der Dateien aus, beginnend mit dem /homeVerzeichnis.

Ich finde es äußerst nützlich, auch die Option -e, Dateien umzubenennen, indem crc32 sum in name eingefügt wird.

Sie können "md5sum" mit "rhash" in den PhoenixNL72-Beispielen ändern.

Marcolino
quelle
1
Was genau macht '/ home /' hier? Dieses Tool sieht ziemlich gut aus.
Andy Ibanez
Ich denke, es ist ein Fehler, es ist sicherlich ein Fehler für mich. Das -p ist das Format für die Ausgabe. Ich werde es korrigieren.
PBHJ
7

Hier sind zwei ausführlichere Beispiele:

  1. Erstellen Sie eine MD5-Datei in jedem Verzeichnis, das noch keine hat, mit absoluten Pfaden:

    find "$PWD" -type d | sort | while read dir; do [ ! -f "${dir}"/@md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 already present" ; [ ! -f "${dir}"/@md5Sum.md5 ] &&  md5sum "${dir}"/* > "${dir}"/@md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5;done 
    
  2. Erstellen Sie eine MD5-Datei in jedem Ordner, der noch keine hat: keine Pfade, nur Dateinamen:

    find "$PWD" -type d | sort | while read dir; do cd "${dir}"; [ ! -f @md5Sum.md5 ] && echo "Processing " "${dir}" || echo "Skipped " "${dir}" " @md5Sum.md5 allready present" ; [ ! -f @md5Sum.md5 ] &&  md5sum * > @md5Sum.md5 ; chmod a=r "${dir}"/@md5Sum.md5 ;done 
    

Was sich zwischen 1 und 2 unterscheidet, ist die Art und Weise, wie die Dateien in der resultierenden md5-Datei dargestellt werden.

Die Befehle führen Folgendes aus:

  1. Erstellen Sie eine Liste der Verzeichnisnamen für den aktuellen Ordner. (Baum)
  2. Sortieren Sie die Ordnerliste.
  3. Überprüfen Sie in jedem Verzeichnis, ob die Datei @ md5sum.md5 existiert. Ausgabe Übersprungen, falls vorhanden, Ausgabe Verarbeitung, falls nicht vorhanden.
  4. Wenn die Datei @ md5Sum.md5 nicht vorhanden ist, generiert md5Sum eine mit den Prüfsummen aller Dateien im Ordner. 5) Setzen Sie die generierte Datei @ md5Sum.md5 auf schreibgeschützt.

Die Ausgabe dieses gesamten Skripts kann in eine Datei umgeleitet (.....; done> test.log) oder an ein anderes Programm weitergeleitet werden (z. B. grep). Die Ausgabe gibt nur an, welche Verzeichnisse übersprungen und welche verarbeitet wurden.

Nach einer erfolgreichen Ausführung erhalten Sie eine @ md5Sum.md5-Datei in jedem Unterverzeichnis Ihres aktuellen Verzeichnisses

Ich habe die Datei @ md5Sum.md5 genannt, damit sie in einer Samba-Freigabe oben im Verzeichnis aufgeführt wird.

Das Überprüfen aller @ md5Sum.md5-Dateien kann mit den folgenden Befehlen erfolgen:

find "$PWD" -name @md5Sum.md5 | sort | while read file; do cd "${file%/*}"; md5sum -c @md5Sum.md5; done > checklog.txt

Anschließend können Sie die Datei checklog.txt mit grep -v OK prüfen, um eine Liste aller Dateien zu erhalten, die sich unterscheiden.

Um eine @ md5Sum.md5 in einem bestimmten Verzeichnis neu zu generieren, löschen Sie zum Beispiel beim Ändern oder Hinzufügen von Dateien die Datei @ md5Sum.md5 oder benennen Sie sie um und führen Sie den Befehl generate erneut aus.

PhoenixNL72
quelle
Befehl 1 mit vollständigen Pfaden: md5sum "$ {dir}" / * nimmt keine versteckten Dateien auf, die mit Punkt beginnen. Irgendwelche Heilmittel?
user14654
Verspätet zur Party, aber da md5sum Dateinamen haben möchte (scheint unzufrieden zu sein, wenn Sie ihm ein Verzeichnis geben), ist es möglicherweise am einfachsten, nach Hilfe zu fragen: $ md5sum $ (finde "$ dir" -maxdepth 0 -type f) Typ f "ruft reguläre und versteckte Dateien ab (find hat auch viele Optionen, kann aber sehr hilfreich sein). Lassen Sie den Teil "-maxdepth 0" weg, wenn Sie alles rekursiv wollen. Hinweis: Dies ist fragil, wenn die Dateinamen Leerzeichen enthalten. Sie können sich über xargs und -0 ( de.wikipedia.org/wiki/Xargs )
jgreve
0

Ich bin auf dieses Problem gestoßen, und obwohl die obigen Lösungen elegant sind, wollte ich einen schnellen und schmutzigen Hack für diese Situation: 1 Verzeichnis mit Unterverzeichnissen, die eine Ebene tiefer liegen.

Geben Sie also das Verzeichnis in eine Shell ein und führen Sie Folgendes aus:

md5sum * */* 2>/dev/null > md5sum.md5

Dadurch werden alle Dateien im obersten Verzeichnis abgerufen, die Fehlerwarnung über die Unterverzeichnisse als Verzeichnisse entfernt und md5sums für den Inhalt des Unterverzeichnisses ausgeführt. Vorteil: leicht zu merken, macht genau das, was es tun soll. Ich bin immer verwirrt von der Suchsyntax und kann mich nicht mehr an sie erinnern. Es ist also nicht erforderlich, eine Schleife usw. durchzuführen, die sich mit Leerzeichen in Verzeichnisnamen befasst. Dieser eine Liner hat einwandfrei funktioniert. Keine robuste, leistungsstarke Lösung, die nicht für Unterverzeichnisse mit mehr als einer Ebene geeignet ist, sondern eine schnelle und einfache Lösung für das Problem.

Lizardx
quelle