Holen Sie den Hash-Wert nur mit md5sum (ohne Dateinamen).


176

Ich benutze md5sum, um einen Hashwert für eine Datei zu generieren. Aber ich muss nur den Hash-Wert erhalten, nicht den Dateinamen.

md5=`md5sum ${my_iso_file}`
echo ${md5}

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Wie kann ich den Dateinamen "entfernen" und nur den Wert behalten?


27
Sehr überraschend, dass dies keine Option für md5sum ist.
Sridhar Sarnobat

11
Einverstanden! Warum ist das keine Option? Kann ein GNU-Meister etwas Licht ins Dunkel bringen?
Rinogo

Warum benötigen Sie ein "Nur-Hash" -Flag, wenn Sie das Ergebnis mit einem regulären Ausdruck kürzen können? (Ich bin sarkastisch)
Magnetic_dud

Antworten:


163

Naja ein anderer Weg :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`

7
Oder md5=`md5sum < ${my_iso_file}` dies gibt jedoch am Ende immer noch "-" aus. Für Vergleiche sollte dies jedoch ausreichen.
Christophe De Troyer

Falsch, es gibt folgende Ausgabe auf dem Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71und Ihr Code kehrt zurück MD5.
Alper

Sie können ausgeführt -werden, indem Sie das | awk '{print $1}'Ende Ihres Codes hinzufügen => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

Eine einfache Array-Zuweisung funktioniert ... Beachten Sie, dass das erste Element eines bashArrays nur mit dem nameohne [0]Index adressiert werden kann , dh $md5nur die 32 Zeichen der md5sum enthält.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2

Genial. Nur eine Frage, ich weiß, dass die Frage markiert ist bash, aber können Sie mir sagen, ob das Array nur eine Bash-Funktion oder ein Shell-Standard ist?
Jyz

Die erste Zeile funktioniert nicht im do-Bereich einer for-Schleife ... als Bash-Neuling weiß ich noch nicht warum
Andy

@ Andy: Wenn Sie diese Codezeile versuchen (im Terminal oder in einem Skript): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Es sollte ausgegeben werden68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
Wie kommt echo ($(echo -n foo | md5sum))es, dass es nicht funktioniert? Fehler aus bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav: Der Befehl echo -n foo | md5sum gibt 2 Shell- Wörter an stdout aus : acbd18db4cc2f85cedef654fccc4a4d8und -(das -gibt die Quelle als stdin an ). - Sie müssen bash anweisen , diese Wörter mithilfe der Befehlsersetzung in einer Zeichenfolge zu erfassen : $( command ). - Die (Klammern )erzeugen ein Bash-Array mit 2 Elementen. Sie müssen dieses Array-Konstrukt ( … )jedoch einem Variablennamen zuweisen . Verwenden Sie daher md5 als Array-Namen : md5=($(echo -n foo | md5sum)). Sie haben das Array keinem Variablennamen zugewiesen
Peter.O

57

Sie können cutdie Zeile auf Leerzeichen aufteilen und nur das erste derartige Feld zurückgeben:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)

18
Odercut -c 1-32
Czarek Tomczak

7
@CzarekTomczak Richtig, aber nur mit der Methode dieser Antwort können Sie sie mit verschiedenen Hashing-Algorithmen wiederverwenden, indem Sie den Befehl selbst ändern. md5sum-> sha256sumohne sich zu merken, wie viele Zeichen Sie "schneiden" müssen.
David Tabernero M.

23

Unter Mac OS X:

md5 -q file

funktioniert unter meinem Mac OS X 10.7 nicht. Aber danke fürs Posten, für welche Version auch immer dies funktioniert.
Sridhar Sarnobat

Auch gmd5sumvon coreutilswürde unter MacOS funktionieren wie md5sumin anderen hier genannten Antworten.
Anton Tarasenko

14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"

Nett. Eine Anmerkung - in der ersten Zeile brauchen Sie keine Anführungszeichen $()(obwohl sie keinen Schaden anrichten), aber Sie brauchen sie auf jeden Fall ${}.
Roman Cheplyaka

1
@Roman: Ja, ich zitiere gewöhnlich jede Erweiterung (es sei denn, es gibt einen Grund, dies nicht zu tun) - es ist einfacher, als die Fälle zu verfolgen, in denen es sicher ist, die Zitate zu überspringen. (Obwohl ich in diesem Fall den tatsächlichen Dateinamen weggelassen habe ... stehen Sie für eine Bearbeitung bereit.)
Gordon Davisson

5

Einweg:

set -- $(md5sum $file)
md5=$1

Ein anderer Weg:

md5=$(md5sum $file | while read sum file; do echo $sum; done)

Ein anderer Weg:

md5=$(set -- $(md5sum $file); echo $1)

(Versuchen Sie das nicht mit Back-Ticks, es sei denn, Sie sind sehr mutig und sehr gut mit Backslashes.)

Der Vorteil dieser Lösungen gegenüber anderen Lösungen besteht darin, dass sie nur md5sumdie Shell aufrufen und nicht andere Programme wie awkoder sed. Ob das wirklich wichtig ist, ist dann eine separate Frage; Es würde Ihnen wahrscheinlich schwer fallen, den Unterschied zu bemerken.


4

Ein anderer Weg ist:

md5sum filename |cut -f 1 -d " "

Durch Ausschneiden wird die Linie in jedes Leerzeichen geteilt und nur das erste Feld zurückgegeben.



2

Wenn Sie es drucken müssen und keinen Zeilenumbruch benötigen, können Sie Folgendes verwenden:

printf $(md5sum filename)


0

md5sumSetzt einen Backslash vor den Hash, wenn der Dateiname einen Backslash enthält. Die ersten 32 Zeichen oder irgendetwas vor dem ersten Leerzeichen sind möglicherweise kein richtiger Hash. Es wird nicht passieren, wenn Standardeingaben verwendet werden (Dateiname ist nur -), daher funktioniert die Antwort von Pixelbeat , aber viele andere erfordern das Hinzufügen von etwas wie | tail -c 32.


0

Nun, ich hatte heute das gleiche Problem, aber ich habe versucht, beim Ausführen des findBefehls den Datei-MD5-Hash abzurufen . Ich habe die am häufigsten gestellte Frage erhalten und sie in eine Funktion eingeschlossen, die aufgerufen wurde md5, um den Befehl find auszuführen. Die Mission für mich war es, Hash für alle Dateien in einem Ordner zu berechnen und als auszugeben hash:filename.

md5() { md5sum $1 | awk '{ printf "%s",$1 }'; }
export -f md5
find -type f -exec bash -c 'md5 "$0"' {} \; -exec echo -n ':' \; -print

Also, ich hatte ein paar Stücke von hier und auch von find -exec eine Shell-Funktion?


0

Der Vollständigkeit halber einen Weg mit sed unter Verwendung von Regex und Capture Group:

md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')

Der regulare Ausdruck erfasst alles in einer Gruppe, bis ein Leerzeichen erreicht ist. Damit die Erfassungsgruppe funktioniert, müssen Sie alles in sed erfassen. (Weitere Informationen zu sed- und caputer-Gruppen finden Sie hier: https://stackoverflow.com/a/2778096/10926293 )
Als Trennzeichen in sed verwende ich Doppelpunkte, da sie in Dateipfaden nicht gültig sind und ich den Schrägstrichen in der nicht entkommen muss Dateipfad.


-3

Ein anderer Weg:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.