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?
Antworten:
Naja ein anderer Weg :)
quelle
md5=`md5sum < ${my_iso_file}`
dies gibt jedoch am Ende immer noch "-" aus. Für Vergleiche sollte dies jedoch ausreichen.MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71
und Ihr Code kehrt zurückMD5
.-
werden, indem Sie das| awk '{print $1}'
Ende Ihres Codes hinzufügen =>md5sum < ${my_iso_file} | awk '{print $1}'
@ChristopheDeTroyerEine einfache Array-Zuweisung funktioniert ... Beachten Sie, dass das erste Element eines
bash
Arrays nur mit demname
ohne[0]
Index adressiert werden kann , dh$md5
nur die 32 Zeichen der md5sum enthält.quelle
bash
, aber können Sie mir sagen, ob das Array nur eine Bash-Funktion oder ein Shell-Standard ist?echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done
- Es sollte ausgegeben werden68b329da9893e34099c7d8ad5cb9c940
echo ($(echo -n foo | md5sum))
es, dass es nicht funktioniert? Fehler ausbash: syntax error near unexpected token $(echo -n foo | md5sum)'
echo -n foo | md5sum
gibt 2 Shell- Wörter an stdout aus :acbd18db4cc2f85cedef654fccc4a4d8
und-
(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 zugewiesenSie können
cut
die Zeile auf Leerzeichen aufteilen und nur das erste derartige Feld zurückgeben:quelle
cut -c 1-32
md5sum
->sha256sum
ohne sich zu merken, wie viele Zeichen Sie "schneiden" müssen.Unter Mac OS X:
quelle
gmd5sum
voncoreutils
würde unter MacOS funktionieren wiemd5sum
in anderen hier genannten Antworten.quelle
$()
(obwohl sie keinen Schaden anrichten), aber Sie brauchen sie auf jeden Fall${}
.Einweg:
Ein anderer Weg:
Ein anderer Weg:
(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
md5sum
die Shell aufrufen und nicht andere Programme wieawk
odersed
. Ob das wirklich wichtig ist, ist dann eine separate Frage; Es würde Ihnen wahrscheinlich schwer fallen, den Unterschied zu bemerken.quelle
Ein anderer Weg ist:
Durch Ausschneiden wird die Linie in jedes Leerzeichen geteilt und nur das erste Feld zurückgegeben.
quelle
quelle
Wenn Sie es drucken müssen und keinen Zeilenumbruch benötigen, können Sie Folgendes verwenden:
quelle
quelle
md5sum
Setzt 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
.quelle
Nun, ich hatte heute das gleiche Problem, aber ich habe versucht, beim Ausführen des
find
Befehls den Datei-MD5-Hash abzurufen . Ich habe die am häufigsten gestellte Frage erhalten und sie in eine Funktion eingeschlossen, die aufgerufen wurdemd5
, 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 auszugebenhash:filename
.Also, ich hatte ein paar Stücke von hier und auch von find -exec eine Shell-Funktion?
quelle
Der Vollständigkeit halber einen Weg mit sed unter Verwendung von Regex und Capture Group:
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.
quelle
Ein anderer Weg:
quelle
quelle