Hallo LUG!
Ich möchte ein Script basteln welches eine IF-Anweisung enthält.
Diese IF-Anweisung soll prüfen ob 2 vorgegebene Dateien identisch oder unterschiedlich sind - und dementsprechend in den true bzw. false Zweig verzweigen.
Ich hoffe Ihr könnt mir da helfen...
Thx!
Tino
Ich möchte ein Script basteln welches eine IF-Anweisung enthält.
Was für ein Skript? Perl, Python, bash, tcsh, zsh, csh, tcl/tk, make, php, ... [1]
[1] Die Reihenfolge bzw. die Auswahl der Skript-Sprachen stellt keine Wertung oder Grundlage für einen Flame-War dar ;-)
Diese IF-Anweisung soll prüfen ob 2 vorgegebene Dateien identisch oder unterschiedlich sind - und dementsprechend in den true bzw. false Zweig verzweigen.
Ich hoffe Ihr könnt mir da helfen...
Auf der Konsole würde das so aussehen. jens@home:~$ md5sum file_1 file_2 d41d8cd98f00b204e9800998ecf8427e file_1 38ece1a7dd61cfcea156732aeafa85b7 file_2
In einem Skript gibt es mehrere Möglichkeiten. - Du kannst das Programm md5sum aus deinem Skript heraus aufrufen, die Ausgabe in einer Variablen (Array) abspeichern und dann die beiden Zahlen vergleichen. - Falls deine Skriptsprache auch MD5-Summen berechnen kann, dann benutzt du einfach diese Funktion und prüfst deine Dateien.
Jens Weiße
Jens Weiße wrote:
Auf der Konsole würde das so aussehen. jens@home:~$ md5sum file_1 file_2 d41d8cd98f00b204e9800998ecf8427e file_1 38ece1a7dd61cfcea156732aeafa85b7 file_2
Du bringst mich da auf eine Idee. Wenn man 2 Files vergleichen kann ist es zwar besser, wenn man die Möglichkeit hat, sie direkt zu vergleichen, dies auch zu tun, denn rein theoretisch (allerdings mit geringer Chance) kann der Vergleichnder md5-Summen fehlschlagen (Es ist also theoretisch möglich, daß 2 Files mit unterschiedlichem Inhalt dieselben md5-Hashes liefern) Aber davon abgesehen kann man foolgendermaßen auch vergleichen:
test $( md5sum file1 file2 | uniq | wc -l ) -eq 1 && echo gleich || echo ungleich
Und der Vorteil hierbei ist, dass man ohne großem Streß auch 3 oder mehr files vergleichen kann und wenn ALLE gleich sind, wird 'gleich' ausgegeben:
test $( md5sum file1 file2 file3 ... filen | uniq | wc -l ) -eq 1 && echo gleich || echo ungleich
Frank Schwidom
On 29.10.03 Frank Schwidom (schwidom@impernet.de) wrote:
Moin,
Und der Vorteil hierbei ist, dass man ohne großem Streß auch 3 oder mehr files vergleichen kann und wenn ALLE gleich sind, wird 'gleich' ausgegeben:
test $( md5sum file1 file2 file3 ... filen | uniq | wc -l ) -eq 1 && echo gleich || echo ungleich ^
an der Stelle vielleicht noch sowas, wie awk '{print $1}' einschieben.
H.
On Fri, Oct 31, 2003 at 11:21:00AM +0100, Hilmar Preusse wrote:
On 29.10.03 Frank Schwidom (schwidom@impernet.de) wrote:
test $( md5sum file1 file2 file3 ... filen | uniq | wc -l ) -eq 1 && echo gleich || echo ungleich ^
an der Stelle vielleicht noch sowas, wie awk '{print $1}'
oder (damit's nicht ein zusätzlicher Programmaufruf wird:
test $(md5sum filea file2 file3 ...fileN | while read a b; do echo $a; done | uniq ...
Heiko
Heiko Schlittermann wrote:
On Fri, Oct 31, 2003 at 11:21:00AM +0100, Hilmar Preusse wrote:
On 29.10.03 Frank Schwidom (schwidom@impernet.de) wrote:
test $( md5sum file1 file2 file3 ... filen | uniq | wc -l ) -eq 1 && echo gleich || echo ungleich ^
an der Stelle vielleicht noch sowas, wie awk '{print $1}'
oder (damit's nicht ein zusätzlicher Programmaufruf wird: test $(md5sum filea file2 file3 ...fileN | while read a b; do echo $a; done | uniq ... Heiko
Klarer Fall. Ich hatte es dummerweise aus lauter Bequemlichkeit (wie Programmierer so sind) an demselben File getestet; kein Wunder also, dass dann der Fehler nicht auftritt :-)
Frank Schwidom
Heiko Schlittermann heiko@schlittermann.de writes:
oder (damit's nicht ein zusätzlicher Programmaufruf wird: test $(md5sum filea file2 file3 ...fileN | while read a b; do echo $a; done | uniq ...
ich bin mir ziemlich sicher, daß der '|while...done'-Teil in einer subshell ausgeführt wird.
On Mon, Nov 03, 2003 at 02:04:30PM +0100, Stefan Seyfried wrote:
Heiko Schlittermann heiko@schlittermann.de writes:
test $(md5sum filea file2 file3 ...fileN | while read a b; do echo $a; done | uniq ...
ich bin mir ziemlich sicher, daß der '|while...done'-Teil in einer subshell ausgeführt wird.
Da magst Du nicht unrecht haben. Kann man das prüfen? Fakt ist jedenfalls, daß innerhalb der Schleife exportierte Variablen hinterher nicht mehr existieren. (Was m.W. bei der Korn-Shell anders ist.)
Best regards from Dresden Viele Gruesse aus Dresden Heiko Schlittermann
Hi Heiko,
On Thu, Nov 13, 2003 at 00:39:17 +0100, Heiko Schlittermann wrote:
ich bin mir ziemlich sicher, daß der '|while...done'-Teil in einer subshell ausgeführt wird.
Da magst Du nicht unrecht haben. Kann man das prüfen? Fakt ist jedenfalls, daß innerhalb der Schleife
In der bash wird die while-Schleife auf jeden Fall in einer Subshell ausgefuehrt. Wenn Du nur eine Eingabeumlenkung hast, kannst Du das verhindern:
while ... do X... done < file
Falls sich eine Pipe nicht umgehen laesst, gibt es noch folgendes Konstrukt:
bla | (while ... do X=... done echo $X )
Ausserhalb der Subshell-Klammern existiert X natuerlich nicht mehr.
bye, Chris
Heiko Schlittermann heiko@schlittermann.de writes:
On Mon, Nov 03, 2003 at 02:04:30PM +0100, Stefan Seyfried wrote:
ich bin mir ziemlich sicher, daß der '|while...done'-Teil in einer subshell ausgeführt wird.
Da magst Du nicht unrecht haben. Kann man das prüfen?
sh -x und auf die Anzahl der '+' am Zeilenanfang achten :-)
Fakt ist jedenfalls, daß innerhalb der Schleife exportierte Variablen hinterher nicht mehr existieren.
Das spricht für die subshell
(Was m.W. bei der Korn-Shell anders ist.)
Ich habe zum glück irgendwann aufgegeben, mich mit Einzelheiten und Besonderheiten der einzelnen Shell-Dialekte rumzuärgern und für mich selbst beschlossen, daß alles, was länger als 3 Zeilen ist, in perl zu erledigen ist :-) Und dort prüfe ich mein Gewissen ausgiebig, bevor ich ein externes Kommando aufrufe, schliesslich ist ja alles, was man aus einer Shell raus normalerweise so aufruft (sed, awk, grep,...) sowieso schon eingebaut :-))
Gruss,
Stefan
On Wed, Oct 29, 2003 at 11:19:42PM +0100, Frank Schwidom wrote:
Wenn man 2 Files vergleichen kann ist es zwar besser, wenn man die Möglichkeit hat, sie direkt zu vergleichen, dies auch zu tun, denn rein theoretisch (allerdings mit geringer Chance) kann der Vergleichnder md5-Summen fehlschlagen (Es ist also theoretisch möglich, daß 2 Files mit unterschiedlichem Inhalt dieselben md5-Hashes liefern)
Genau, wenn wir gleiche Chancen fuer alle md5-Summen annehmen, passiert das aller etwa 2^128 Dateien einmal... MD5 war doch 128 Bits, oder?
cu, Ulf
Genau, wenn wir gleiche Chancen fuer alle md5-Summen annehmen, passiert das aller etwa 2^128 Dateien einmal...
2^128 bzw. 3.4 * 10^38
Die Kollisionswahrscheinlichkeit dürfte im Hausgebrauch ausreichend gering sein. Aber halt nicht Null :-( Vielleicht sollte man sich für das beschriebene Einsatzszenario doch liber für einen Bit-weisen Vergleich entscheiden.
MD5 war doch 128 Bits, oder?
Laut Bruce Schneier arbeitet MD5 immer noch mit 128 Bit.
Jens Weiße
Jens Weiße jens.weisse@gmx.net writes:
Die Kollisionswahrscheinlichkeit dürfte im Hausgebrauch ausreichend gering sein. Aber halt nicht Null :-( Vielleicht sollte man sich für das beschriebene Einsatzszenario doch liber für einen Bit-weisen Vergleich entscheiden.
insbesondere da er auch viel schneller ist: für die md5-Summe muss immer die ganze Datei eingelesen werden, die Berechnung des Hashes ist aufwendig. Beim einfachen "diff" kann beim ersten Unterschied sofort abgebrochen werden.
Gruss,
Stefan
Ulf Lorenz wrote:
On Wed, Oct 29, 2003 at 11:19:42PM +0100, Frank Schwidom wrote:
Wenn man 2 Files vergleichen kann ist es zwar besser, wenn man die Möglichkeit hat, sie direkt zu vergleichen, dies auch zu tun, denn rein theoretisch (allerdings mit geringer Chance) kann der Vergleichnder md5-Summen fehlschlagen (Es ist also theoretisch möglich, daß 2 Files mit unterschiedlichem Inhalt dieselben md5-Hashes liefern)
Genau, wenn wir gleiche Chancen fuer alle md5-Summen annehmen, passiert das aller etwa 2^128 Dateien einmal... MD5 war doch 128 Bits, oder?
cu, Ulf
Und das bedeutet wiederum, daß zu einer Datei mit einer Länge von n (mit n > 128) 2^(n-128)-1 weitere Dateien mit demselben md5hash existieren, vorausgesetzt, gleiche md5hashes sind zu gleichen Teilen in allen Bitkombinationen von Dateien > 128 Bit enthalten. Schlimm, schlimm :-)
Frank Schwidom.
On Sunday 02 November 2003 00:03, Ulf Lorenz wrote:
Genau, wenn wir gleiche Chancen fuer alle md5-Summen annehmen, passiert das aller etwa 2^128 Dateien einmal... MD5 war doch 128 Bits, oder?
Richtig: MD5 hat 128 Bit.
Falsch: "alle 2^128 Dateien" -> die Kollissionswahrscheinlichkeit ist 2^64. Sprich unter 2^64+1 Dateien sind statistisch zwei mit identischem MD5. Die Kollissionswahrscheinlichkeit ist immer die Quadratwurzel der Anzahl der moeglichen Werte.
Im Gegensatz zu: eine in 2^128 verschiedenen Dateien wird den selben MD5 haben wie diese eMail.
Gemeinerweise ist die Kollissionswahrscheinlichkeit die kritische Groesse bei der Beurteilung von Hashes...
Kleines Beispiel zum Ausprobieren: nimm 16 (2^4) Skatkarten. Mische sie.
Uebung 1: versuche eine spezielle Karte zu ziehen (sagen wir Pik Bube), Du wirst durchschnittlich 16 Versuche brauchen, um diese Karte zu ziehen (Achtung: nach dem Ziehen die Karte zurueckmischen).
Uebung 2: ziehe nacheinander Karten (mit zuruecklegen!!) und schreibe die Werte auf. Stoppe sobald Du eine gezogen hast, die Du in dieser Serie schonmal hattest. Du solltest darauf kommen, dass Du durchschnittlich 4 Karten ziehst, bevor Du ein Duplikat hast.
Sprich: Wahrscheinlichkeit jedes einzelnen Wertes = 2^4, Kollisionswahrscheinlichkeit = 2^2.
Konrad
Am 02. November 2003 schrieb Konrad Rosenbaum:
Falsch: "alle 2^128 Dateien" -> die Kollissionswahrscheinlichkeit ist 2^64.
Kommt darauf an. Für eine bestimmte Datei ist die Wahrscheinlichkeit eine Kollision zu finden 1/2^128. Dagegen ist unter 2^64 beliebigen Dateien die Kollisionswahrscheinlichkeit bereits 1/2. Das ist das sogenannte Geburtstagsparadoxon: unter 23 (!) beliebigen Leuten gibt mit der Wahrscheinlichkeit 1/2 mindestens zwei Leute mit dem gleichen Geburtsdatum.
Das ganze gilt nur bei kleinen Wahrscheinlichkeiten p mit der Näherung ln(1 - p) = -p.
Torsten
On Sun, Nov 02, 2003 at 04:59:46PM +0100, Konrad Rosenbaum wrote: Content-Description: signed data
On Sunday 02 November 2003 00:03, Ulf Lorenz wrote:
Genau, wenn wir gleiche Chancen fuer alle md5-Summen annehmen, passiert das aller etwa 2^128 Dateien einmal... MD5 war doch 128 Bits, oder?
Richtig: MD5 hat 128 Bit.
Falsch: "alle 2^128 Dateien" -> die Kollissionswahrscheinlichkeit ist 2^64. Sprich unter 2^64+1 Dateien sind statistisch zwei mit identischem MD5. Die Kollissionswahrscheinlichkeit ist immer die Quadratwurzel der Anzahl der moeglichen Werte.
Wir vergleichen aber immer nur wenige Dateien, und da ist die Kollisionswahrscheinlichkeit in der selben Groessenordnung wie die Anzahl der Kombinationen (wir werden uns hier ja nicht um einige poplige Zweierpotenzen streiten).
Ulf
On Wed, Oct 29, 2003 at 08:50:43PM +0100, Tino Schmidt wrote:
Hallo LUG!
Hi Tino,
Ich m??chte ein Script basteln welches eine IF-Anweisung enth??lt.
Diese IF-Anweisung soll pr??fen ob 2 vorgegebene Dateien identisch oder unterschiedlich sind - und dementsprechend in den true bzw. false Zweig verzweigen.
diff -q file1 file2 > /dev/null if [ $? ]; then echo "differ"; else echo "same"; fi
$? enthält immer den Rückgabewert des zuletzt aufgerufnen Programms.
Ciao, Tobias
Hi!
Content-Type: text/plain; charset=
Hier solltest Du auch wirklich einen Zeichensatz angeben (ich vermute mal ganz stark UTF-8), sonst bleibt von Deinen Umlauten nur Müll übrig...
Am 2003-10-29 20:50 +0100 schrieb Tino Schmidt:
Ich m??chte ein Script basteln welches eine IF-Anweisung enth??lt.
Diese IF-Anweisung soll pr??fen ob 2 vorgegebene Dateien identisch oder unterschiedlich sind - und dementsprechend in den true bzw. false Zweig verzweigen.
Mit bash würde ich etwa
if [ "`diff -q file1 file2`" ]; then echo Verschieden else echo Gleich fi
machen.
Martin
On Wed, Oct 29, 2003 at 08:50:43PM +0100, Tino Schmidt wrote:
Hallo LUG!
Ich m??chte ein Script basteln welches eine IF-Anweisung enth??lt.
Diese IF-Anweisung soll pr??fen ob 2 vorgegebene Dateien identisch oder unterschiedlich sind - und dementsprechend in den true bzw. false Zweig verzweigen.
Wie an anderer Stelle schon bemerkt, gibt es viele Script-Sprachen. In der Shell würde es so aussehen:
#! /bin/bash
...
if cmp --silent DATEI1 DATEI1; then echo "Beide sind identisch" else echo "Es gibt Unterschiede" fi
Heiko
Hallo Tino,
Am 29. Oktober 2003 schrieb Tino Schmidt:
Ich möchte ein Script basteln welches eine IF-Anweisung enth�lt.
dein Zeichensatz ist kaputt.
Diese IF-Anweisung soll prÃ?fen ob 2 vorgegebene Dateien identisch oder unterschiedlich sind - und dementsprechend in den true bzw. false Zweig verzweigen.
if cmp -s /vmlinuz /vmlinuz.old; then echo gleich; else echo verschieden; fi
Torsten
lug-dd@mailman.schlittermann.de