(gelöst) md5sum

Du hast Probleme mit Deinem eMail-Programm, Webbrowser oder Textprogramm? Dein Lieblingsprogramm streikt?
fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 09.06.2020 11:17:28

Das klappt natürlich nur solange, wie die Daten auch ins RAM, respektive Cache, passen.
Da dürfte der Hund begraben liegen, so anspruchsvolle Hardware (RAM-Ausstattung) habe ich nicht. :P

Aber ok, ich behalt's im Hinterkopf, wenn ich mal in die Situation kommen sollte, dass das klappen könnte.

@TomL
Kleiner Tipp: man muss keine Prüfsummen vergleichen, man kann, wenn man's geschickt genug anstellt (Erstellen der Prüfsummendatei IM Quellverzeichnis, so dass sie keine Pfade enthält!) mit dieser jederzeit eine zugehörige Datei überprüfen (mit md5sum -c [was-weiß-ich].md5), egal wo die zu prüfende Datei gerade gespeichert ist und vorausgesetzt, die Prüfsummendatei befindet sich im selben Verzeichnis mit ihr .
Zuletzt geändert von fischig am 09.06.2020 11:41:10, insgesamt 2-mal geändert.

wanne
Moderator
Beiträge: 7438
Registriert: 24.05.2010 12:39:42

Re: md5sum

Beitrag von wanne » 09.06.2020 11:26:48

fischic hat geschrieben: ↑ zum Beitrag ↑
09.06.2020 09:43:15
Ist es möglich, beim Kopieren einer Datei (mit einer Größe im unteren GB-Bereich), gleichzeitig deren Prüfsumme schreiben zu lassen?
Klar. leider nicht so ganz primitiv.

Code: Alles auswählen

mkfifo /tmp/sum
md5sum /tmp/sum &
cat ~/pfad/alte.datei | tee /tmp/sum > ~/pfad/neue.datei
rm /tmp/sum
Ersetzt

Code: Alles auswählen

cp ~/pfad/alte.datei ~/pfad/neue.datei
Eventuell willst du dir da ein eigenes Script für anlegen.
rot: Moderator wanne spricht, default: User wanne spricht.

wanne
Moderator
Beiträge: 7438
Registriert: 24.05.2010 12:39:42

Re: md5sum

Beitrag von wanne » 09.06.2020 11:40:45

rot: Moderator wanne spricht, default: User wanne spricht.

wanne
Moderator
Beiträge: 7438
Registriert: 24.05.2010 12:39:42

Re: md5sum

Beitrag von wanne » 09.06.2020 11:42:06

Ah und in viel kürzer:

Code: Alles auswählen

cat ~/pfad/alte.datei | tee ~/pfad/neue.datei | md5sum
statt

Code: Alles auswählen

cp ~/pfad/alte.datei ~/pfad/neue.datei
rot: Moderator wanne spricht, default: User wanne spricht.

fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 09.06.2020 11:45:08

Ziemlich viel Bohai für die Kleinigkeit :P , aber entzückend! Ich werd's beim nächsten mal ausprobieren. :THX:

wanne
Moderator
Beiträge: 7438
Registriert: 24.05.2010 12:39:42

Re: md5sum

Beitrag von wanne » 09.06.2020 13:11:48

fischic hat geschrieben: ↑ zum Beitrag ↑
09.06.2020 11:45:08
Ziemlich viel Bohai für die Kleinigkeit :P , aber entzückend!
Die letzte Variante finde ich fast handlich.
Ansonsten: Wie gesagt: Schreibe/Lade halt das Script, lege es nach local/bin und dann kannst du es wie cp verwenden.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Meillo
Moderator
Beiträge: 8765
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: md5sum

Beitrag von Meillo » 09.06.2020 15:13:56

wanne hat geschrieben: ↑ zum Beitrag ↑
09.06.2020 11:42:06
Allerdings bleibt die Frage, ob es so in der Praxis auch am effektivsten ist. Manchmal lohnt es sich, die Dinge im Detail weniger optimiert zu machen, wenn man dadurch generellere Vorteile oder Vorteile in anderen Bereichen gewinnt. Vielleicht ist das Lesen auf dem Quellsystem gar nicht das Bottleneck, sondern die Uebertragung im Netz.
Genau darum geht es mir doch. Die erste Lösung mit der FIFOs läuft bei mir relativ regelmäßig mit sha384sum. Und das ist halt wirklich der doppelte Speed als anders. Damit kann ich bei uns die Crypto weg optimieren (Daten sind nicht vertraulich.) dann ist das ein noch viel Enormer Vorteil.
Use ed once in a while!

fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 10.06.2020 13:49:19

Code: Alles auswählen

cat /pfad/alte.datei | tee /neuer Pfad/alte.datei | md5sum
Soweit, so gut. Der Kopiervorgang erscheint mir deutlich schneller als mit cp. Aber die nackte md5-Summe erscheint nur als Terminal-Ausgabe, in dem das Kommando gestartet wurde. Es ist mir nicht gelungen, das Kommando dahingehend zu ändern, dass eine md5-Summendatei im Zielverzeichnis angelegt wird, in Format, wie es etwa

Code: Alles auswählen

md5sum alte.datei > /neuer Pfad/alte.datei.md5
, ausgeführt im Quellverzeichnis machte. (wenn ich Dateien in andere Verzeichnisse kopiere, ändere ich im Allgemeinen den Dateinamen nicht.)

Code: Alles auswählen

cat ~/pfad/alte.datei | tee ~/neuer pfad/alte.datei | md5sum > /neuer pfad/alte.datei.md5
funktioniert, aber alte.datei.md5 muss dann nachgearbeitet werden.

Benutzeravatar
MSfree
Beiträge: 10657
Registriert: 25.09.2007 19:59:30

Re: md5sum

Beitrag von MSfree » 10.06.2020 14:05:05

fischic hat geschrieben: ↑ zum Beitrag ↑
10.06.2020 13:49:19

Code: Alles auswählen

cat ~/pfad/alte.datei | tee ~/neuer pfad/alte.datei | md5sum > /neuer pfad/alte.datei.md5
funktioniert, aber alte.datei.md5 muss dann nachgearbeitet werden.
Dann steck es doch in ein kleines Skript namens md5cp mit folgendem Inhalt:

Code: Alles auswählen

#!/bin/bash
sum=$(cat $1 | tee $2 | md5sum)
echo $sum" "$2 > $2.md5
Aufgefufen mit

Code: Alles auswählen

md5cp AlteDatei NeueDatei
entstehen die Dateien NeueDatei und NeueDatei.md5 mit korrektem Inhalt.

fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 10.06.2020 22:55:30

Sehe ich recht, dass bei wannes und MSFrees Konstrukt die Prüfsumme der Kopie/des Kopiervorgangs ausgegeben/in die Prüfsummendatei geschrieben wird? Das wäre nicht gerade das, was ich haben will.

Benutzeravatar
MSfree
Beiträge: 10657
Registriert: 25.09.2007 19:59:30

Re: md5sum

Beitrag von MSfree » 10.06.2020 23:11:10

fischic hat geschrieben: ↑ zum Beitrag ↑
10.06.2020 22:55:30
Sehe ich recht, dass bei wannes und MSFrees Konstrukt die Prüfsumme der Kopie/des Kopiervorgangs ausgegeben/in die Prüfsummendatei geschrieben wird?
Prüfsummenberechnung und Kopie finden gleichzeitig statt. cat schickt die Datei auf stdout, tee nimmt die Daten über stdin entgegen und erzeugt zwei Ausgabströme, einen, der direkt in die Zieldatei geht und einen zweiten, der wiederum auf stdout schreibt. md5sum nimmt dann den stdout-Kanal, den tee erzeugt hat, entgegen und berechnet die Prüfsumme.

Das Ergebnis der Prüfsumme landet in der Varable sum, die dann mit echo und dem Namen der Ausgabedatei in der md5-Datei landet.
Das wäre nicht gerade das, was ich haben will.
Was denn sonst?

fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 11.06.2020 07:33:59

Genauso hatte ich meine eigenen Informationen zum Verfahren verstanden.
Was denn sonst?
Ich will die Prüfsumme der Quelldatei, ohne irgendwelche Bearbeitung, so wie ich diese mit

Code: Alles auswählen

md5sum alte-datei > summendatei
erhalte. Ob im Prozess Fehler erst dann auftreten können, wenn das Ziel letztlich beschrieben wird und die Prüfsumme davon gar nicht mehr betroffen sein kann, weiß ich nicht. Zuverlässiger erscheint mir jedenfalls die Erstellung einer Prüfsumme ausschließlich aus der Quelldatei.

Benutzeravatar
Meillo
Moderator
Beiträge: 8765
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: md5sum

Beitrag von Meillo » 11.06.2020 09:27:36

fischic hat geschrieben: ↑ zum Beitrag ↑
11.06.2020 07:33:59
Ich will die Prüfsumme der Quelldatei, ohne irgendwelche Bearbeitung, so wie ich diese mit

Code: Alles auswählen

md5sum alte-datei > summendatei
erhalte. Ob im Prozess Fehler erst dann auftreten können, wenn das Ziel letztlich beschrieben wird und die Prüfsumme davon gar nicht mehr betroffen sein kann, weiß ich nicht. Zuverlässiger erscheint mir jedenfalls die Erstellung einer Prüfsumme ausschließlich aus der Quelldatei.
Irgendwo musst du dich auch mal entscheiden. Man kann nicht alles gleichzeitig haben. ;-)

Wenn du die Pruefsumme auf diese direkteste Weise berechnen willst, dann laesst sich der Vorgang nicht weiter optimieren. Du willst aber eine Optimierung, folglich musst du bereit sein, einen Schritt davon wegzumachen.

Ich frage dich: Sind die folgenden Befehle fuer dich gleichwertig sicher und ohne Bearbeitung?

Code: Alles auswählen

md5sum alte-datei >summendatei
md5sum <alte-datei >summendatei
<alte-datei md5sum >summendatei
cat alte-datei | md5sum >summendatei
cat alte-datei | cat | md5sum >summendatei
cat alte-datei | cat | cat | md5sum >summendatei
Falls du sie gleichwertig sicher findest (wie ich es tue), dann kannst du auch eines der `cat' durch ein `tee DATEI' ersetzen und hast weiterhin ein strukturell gleiches Verfahren.

Entscheidend ist: Die Pruefsumme wird aus dem Lesen der Quelldatei berechnet. Das ist in all diesen und den von wanne und MSfree vorgeschlagenen Varianten der Fall.

(Der knifflige Punkt ist lediglich der Dateiname in der Pruefsummendatei.)
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10657
Registriert: 25.09.2007 19:59:30

Re: md5sum

Beitrag von MSfree » 11.06.2020 09:58:27

fischic hat geschrieben: ↑ zum Beitrag ↑
11.06.2020 07:33:59
Ich will die Prüfsumme der Quelldatei,
Die bekommst du doch mit

Code: Alles auswählen

cat Datei.ein | tee Datei.aus | md5sum
ohne irgendwelche Bearbeitung
Das, was md5sum am Ende ausgibt, hat halt keinen Dateinamen mehr, weil es Daten von stdin liest und der Dateiname unterwegs "verloren" geht.

Ich hatte jetzt nur vorgeschlagen, die Ausgabe des obigen Befehls in eine Variable zu speichern und die händische Nachbearbeitung durch eine automatische Nachbearbeitung zu ersetzen. (siehe der echo-Befehl in der letzten Zeile des Skripts oben) Du hast jetzt also die Wahl, deine Kopie und md5-Berechnung in zwei Schritten auszuführen, was langsamer ist. Oder du führst z.B. mein Skript aus, was Geschwindigkeitsvorteile bringt, aber eine automatische Nachbearbeitung des md5-Ergebnisses erfordert.

In der dadurch erzeugten .md5-Datei steckt tatsächlich die Prüfsumme der Eingabedatei, aber es steht der Dateiname der Ausgabedatei in der .md5-Datei. Das ist so auch durchaus sinnvoll, weil dann jeder Die Prüfsumme der Ausgabedatei neu berechnen kann und mit der .md5-Datei vergleichen kann.

Ein paar Korrekturen an dem Skript sind allerdings noch nötig, da sonst der komplette Pfad in der md5-Datei steht, und ein bißchen Komfort ist auch dazu gekommen:

Code: Alles auswählen

#!/bin/bash
#
# Aufruf:
# md5cp Datei.ein Datei.aus
# oder
# md5cp Datei.ein Zielverzeichnis

infile=$1
outfile=$2

# Wenn outfile ein Verzeichnis ist:
if [[ -d $outfile ]]
then
  outfile=$outfile/${1##*/}
fi

# Datei kopieren und gleichzeitig md5-Summe der
# Eingabedateirechnen und in Variable sum speichern:
sum=$(cat $infile | tee $outfile | md5sum)

# löschen des Minuszeichens am Ende von sum
sum=${sum%?}

# Dateiname aus komplettem Pfad extrahieren
filename=${outfile##*/}

# md5-Datei schreiben
echo $sum $filename > $outfile.md5

fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 11.06.2020 10:35:36

Meillo hat geschrieben:Irgendwo musst du dich auch mal entscheiden. Man kann nicht alles gleichzeitig haben. ;-)
Ich stelle nur Rückfragen, die sich mir beim Durchdenken der mir gemachten Vorschläge ergeben. :wink:

zu cat und tee habe ich keine Rückfragen, das kann ich fraglos nachvollziehen.
Meillo+MSFree hat geschrieben:In der dadurch erzeugten .md5-Datei steckt tatsächlich die Prüfsumme der Eingabedatei
Das ist für mich entscheidend. Und dass können - im Zusammenhang mit den in Frage stehenden Shellkommandos - MSFree und Meillo mit Sicherheit besser beurteilen als ich. :wink: Welchen Dateinamen ich in die md5-Datei stecke ist Nebensache, bzw das kriege ich dann wohl - auch automatisiert - meinen Vorstellungen entsprechend allein hin.

Praktiziert habe ich bisher diesen händischen Dreischritt
1. Erstellen der Prüfsumme einer Quelldatei, IM Pfad dieser Quelldatei. in der md5-Datei steht der nackte Dateinamen der Quelldatei
2. Kopieren von Quelldatei+md5-.Datei an einen anderen Ort (OHNE den nackten Namen der Quelldatei zu ändern, es geht um Videos, ich hatte bisher nie das Bedürfnis, den zu ändern)
3. Überprüfen der Integrität der Zieldatei anhand der md5-Summe der Quelldatei AM Zielort. Dafür genügt dann der nackte Quell=Zieldateinamen in der md5-Datei.

So, und jetzt muss ich MSFrees letzten Vorschlag durchdenken. Dafür benötige ich Zeit, ich halte mich für gründlich, manche meinen, ZU UMSTÄNDLICH gründlich.

wanne
Moderator
Beiträge: 7438
Registriert: 24.05.2010 12:39:42

Re: md5sum

Beitrag von wanne » 11.06.2020 16:31:02

1. Erstellen der Prüfsumme einer Quelldatei, IM Pfad dieser Quelldatei. in der md5-Datei steht der nackte Dateinamen der Quelldatei
2. Kopieren von Quelldatei+md5-.Datei an einen anderen Ort (OHNE den nackten Namen der Quelldatei zu ändern, es geht um Videos, ich hatte bisher nie das Bedürfnis, den zu ändern)
3. Überprüfen der Integrität der Zieldatei anhand der md5-Summe der Quelldatei AM Zielort. Dafür genügt dann der nackte Quell=Zieldateinamen in der md5-Datei.
Auch wenn ich das Vorgehen schon oft gesehen habe: Wenn du nicht über ganz abstruse Programme kopierst ist das sinnlos doppelt. Du weißt doch schon von Anfang an, dass die beiden Dateien gleich sind.
Aaaaber da könnte was schief gehen. Ja. Aber es hilft nichts.
Dein Kopieren besteht aus drei Vorgängen:
  1. Von der platte Lesen
  2. Übertragen
  3. Auf die neue Platte schreiben.
Für die drei schritte gilt:
  1. Wenn du schnell nacheinander 2 mal die Datei ließt und wirst du nichts merken weil dir Linux in den aller meisten Fällen den 2. Lesevorgang eh weg optimiert und schlicht das selbe Ergebnis liefert. Wenn hier also ein Fehler passiert, wird er sowohl vor wie nach dem Übertragen passieren.
  2. Beim Übertragen über IP entstehen so häufig Fehler, dass jedes Übertragungsprotokoll eh nochmal Checksummen einbaut und falsche Teile automatisch korrigiert. Hier können keine Fehler passieren.
  3. Beim Lesen nach Schreiben gilt das gleiche wie in Punkt 1. Das OS wird dir das weg optimieren und die Daten geben, die du geschrieben hast, statt nochmal auf der Platte nachzulesen.
Zu Letzt passieren die meisten Fehler eh nicht beim Lesen oder schreiben sondern eher durch bitrot. Also dass sich auf Datenträgern Bits nach Jahren drehen.
Wenn du wirklich mehr Sicherheit haben willst führt kein Weg daran vor bei ein Layer tiefer anzusetzen => ECC-RAM und error correcting Filesystems alla btrfs/zfs.


Du kannst das mit dem caching relativ schön ausprobieren. Hier mal als Beispil:

Code: Alles auswählen

$ time md5sum /media/data/Film/bbb_sunflower_1080p_60fps_normal.mp4
> 7a7bc8ae38ccbd700e07977a9deb8cb7  /media/data/Film/bbb_sunflower_1080p_60fps_normal.mp4
> real    0m3.565s
$ time md5sum /media/data/Film/bbb_sunflower_1080p_60fps_normal.mp4
> 7a7bc8ae38ccbd700e07977a9deb8cb7  /media/data/Film/bbb_sunflower_1080p_60fps_normal.mp4
> real    0m0.750s
> Das geht so schön viel schneller weil der halt kein 2. mal ließt.

Entsprechend wird mein Kommando fast immer das selbe Ergebnis liefern wie deine Tests.
rot: Moderator wanne spricht, default: User wanne spricht.

fischig
Beiträge: 3584
Registriert: 24.12.2019 12:25:08
Lizenz eigener Beiträge: MIT Lizenz

Re: md5sum

Beitrag von fischig » 11.06.2020 18:18:11

Funktioniert tadellos. Dankeschön, MSFree! :THX:

Code: Alles auswählen

v_z=$v_z/${1##*/}
${v_z##*/}
sum=${sum%?}
Was da passiert, glaube ich zu wissen. Von dem, wie's passiert, habe ich keinen Schimmer. Erklären könnt' ich das Stringgefummel also nicht, auch nicht mir selbst.

Ein Haar in der Suppe - sofern ich sie mögen soll - finde ich noch:
Im Dateinamen der md5-Datei hätte ich gerne die Namenserweiterung (sofern die existiert) der Quelldatei, weggelassen. In pascal könnt' ich's selbst, in shell nicht. :wink:
wanne hat geschrieben:Wenn du wirklich mehr Sicherheit haben willst, führt kein Weg daran vorbei ein Layer tiefer anzusetzen => ECC-RAM und error correcting Filesystems alla btrfs/zfs.
Ich denke, das überlasse ich lieber Leuten, die was davon verstehen - ich tu's nicht. Sooo selten habe ich das nicht erlebt, dass Prüfsummen zwischen Quelle und Ziel nicht identisch waren.

Benutzeravatar
MSfree
Beiträge: 10657
Registriert: 25.09.2007 19:59:30

Re: md5sum

Beitrag von MSfree » 11.06.2020 18:44:36

fischic hat geschrieben: ↑ zum Beitrag ↑
11.06.2020 18:18:11

Code: Alles auswählen

v_z=$v_z/${1##*/}
${v_z##*/}
sum=${sum%?}
Das sind wieder so schöne selbsterklärende Sächelchen, weswegen ich Shell-Programme so liebe. :roll:
Weil das im Grunde unleserlich ist, habe ich ein paar Kommentare dazu gesteckt.
Im Dateinamen der md5-Datei hätte ich gerne die Namenserweiterung (sofern die existiert) der Quelldatei, weggelassen.
Statt

Code: Alles auswählen

echo $sum $filename > $outfile.md5
muß man aus $outfile noch die Namenserweiterung löschen, was mit

Code: Alles auswählen

md5file=${outfile%.*}.md5
vollbringt und gleich ".md5" angehängt.

Das komplette Skript ist dann folgendes:

Code: Alles auswählen

#!/bin/bash
# 
# Aufruf:
# md5cp Datei.ein Datei.aus
# oder
# md5cp Datei.ein Zielverzeichnis

infile=$1
outfile=$2

# Wenn outfile ein Verzeichnis ist:
if [[ -d $outfile ]]
then
  outfile=$outfile/${1##*/}
fi

# Datei kopieren und gleichzeitig md5-Summe der
# Eingabedateirechnen und in Variable sum speichern:
sum=$(cat $infile | tee $outfile | md5sum)

# löschen des Minuszeichens am Ende von sum
sum=${sum%?}

# Dateiname aus komplettem Pfad extrahieren
filename=${outfile##*/}

# Dateinamen aus outfile erzeugen, Extension
# entfernen und .md5 anhängen
md5file=${outfile%.*}.md5
# md5-Datei schreiben
echo $sum $filename > $md5file
Ansonsten sind die String-Operationen in der bash Manpage ganz gut erklärt (wenn auch etwas schwer zu finden). Im Kapitel "Parameter Expansion" (habe hier nur die englischen Manpages installiert) geht es los.

Benutzeravatar
Meillo
Moderator
Beiträge: 8765
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: (gelöst) md5sum

Beitrag von Meillo » 11.06.2020 20:33:02

@MSfree: Schoen, dass du den Verzeichnisfall auch abgedeckt hast. :THX:

Man beachte, dass man mit dieser Variante keine *.md5-Dateien kopieren kann. Eine zusaetzliche Pruefung, ob die md5-Datei schon existiert waere ggf. angebracht. Das sorgt zwar fuer weitere Sonderfaelle, aber ... Nun gut, vielleicht ist das auch nicht noetig und verkompliziert die Sache nur ... Ich wollte es nur angemerkt haben.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10657
Registriert: 25.09.2007 19:59:30

Re: (gelöst) md5sum

Beitrag von MSfree » 11.06.2020 20:58:03

Meillo hat geschrieben: ↑ zum Beitrag ↑
11.06.2020 20:33:02
Man beachte, dass man mit dieser Variante keine *.md5-Dateien kopieren kann. Eine zusaetzliche Pruefung, ob die md5-Datei schon existiert waere ggf. angebracht.
Ja, das war mir auch schon beim Ausprobieren aufgefallen. :mrgreen: :mrgreen: :mrgreen:

Raum für Verbesserungen ist auf alle Fälle vorhanden. Nicht nur die Sonderbehandlung von md5-Dateien, ich könnte das Sktipt auch noch um Wildcards erweitern, damit man es viele Dateien hintereinander abarbeiten kann. :wink:

Antworten