Obtenir la valeur de hachage uniquement en utilisant md5sum (sans nom de fichier)


176

J'utilise md5sum pour générer une valeur de hachage pour un fichier. Mais je n'ai besoin que de recevoir la valeur de hachage, pas le nom du fichier.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Comment puis-je «supprimer» le nom du fichier et ne conserver que la valeur?


27
Très surprenant, ce n'est pas une option pour md5sum.
Sridhar Sarnobat

11
D'accord! Pourquoi n'est-ce pas une option? Un GNU-Master peut-il faire la lumière?
rinogo

Pourquoi avez-vous besoin d'un indicateur "seulement hash" lorsque vous pouvez couper le résultat avec une expression régulière? (Je suis sarcastique)
Magnetic_dud

Réponses:


163

Eh bien une autre façon :)

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

7
Ou md5=`md5sum < ${my_iso_file}` Cependant, cela génère toujours "-" à la fin. Mais pour les comparaisons, cela devrait suffire.
Christophe De Troyer

Faux, il donne la sortie suivante sur Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71et votre code revient MD5.
alper

Vous pouvez vous lancer -en ajoutant la | awk '{print $1}'fin de votre code => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

Une simple affectation de tableau fonctionne ... Notez que le premier élément d'un bashtableau peut être adressé uniquement par le namesans l' [0]index, c'est-à-dire qu'il $md5ne contient que les 32 caractères de la somme md5.

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

Impressionnant. Juste une question, je sais que la question est balisée bash, mais pouvez-vous me dire si le tableau est une fonctionnalité bash uniquement ou un standard de shell?
jyz

la première ligne ne fonctionne pas à l'intérieur de la section do d'une boucle for ... en tant que newb Bash, je ne sais pas encore pourquoi
Andy

@Andy: Si vous essayez cette ligne de code (dans le terminal, ou dans un script): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Elle devrait afficher68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
Pourquoi echo ($(echo -n foo | md5sum))ça ne marche pas? Erreurs out bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav: La commande renvoie echo -n foo | md5sum2 mots shell vers stdout : acbd18db4cc2f85cedef654fccc4a4d8et -(le -indique la source comme stdin ). - Vous devez dire bash pour capturer ces mots dans une chaîne, en utilisant commande Remplacement : $( command ). - Les (crochets )produisent un tableau bash avec 2 éléments. Cependant, vous devez affecter cette construction de tableau ( … )à un nom de variable; par conséquent, en utilisant md5 comme le nom du tableau: md5=($(echo -n foo | md5sum)). Vous n'avez pas assigné le tableau à un nom de variable
Peter.O

57

Vous pouvez utiliser cutpour diviser la ligne sur des espaces et renvoyer uniquement le premier de ces champs:

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

18
Oucut -c 1-32
Czarek Tomczak

7
@CzarekTomczak True, mais simplement en utilisant la méthode de cette réponse, vous pouvez la réutiliser avec différents algorithmes de hachage simplement en modifiant la commande elle-même. md5sum-> sha256sumsans vous souvenir de la quantité de caractères à "couper".
David Tabernero M.

23

Sur Mac OS X:

md5 -q file

ne fonctionne pas sur mon Mac OS X 10.7. Mais merci pour la publication, quelle que soit la version sur laquelle cela fonctionne.
Sridhar Sarnobat

Aussi à gmd5sumpartir de coreutilsfonctionnerait sur MacOS comme md5sumdans d'autres réponses mentionnées ici.
Anton Tarasenko

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

Agréable. Une note - sur la première ligne, vous n'avez pas besoin de citations $()(bien qu'elles ne fassent aucun mal), mais vous en avez certainement besoin ${}.
Roman Cheplyaka

1
@Roman: oui, j'ai tendance à citer habituellement toute extension (à moins qu'il n'y ait une raison de ne pas le faire) - c'est plus facile que de garder une trace des cas où il est sûr de sauter les citations. (Bien que dans ce cas, je les ai laissés hors du nom de fichier réel ... attendez une modification.)
Gordon Davisson

5

Une manière:

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

Autrement:

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

Autrement:

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

(N'essayez pas cela avec des contre-obliques, sauf si vous êtes très courageux et très bon avec des contre-obliques.)

L'avantage de ces solutions par rapport aux autres solutions est qu'elles invoquent uniquement md5sumet le shell, plutôt que d'autres programmes tels que awkou sed. La question de savoir si cela compte réellement est alors une question distincte; vous auriez probablement du mal à remarquer la différence.


4

Une autre façon est de faire:

md5sum filename |cut -f 1 -d " "

Couper divisera la ligne dans chaque espace et ne retournera que le premier champ.



2

Si vous avez besoin de l'imprimer et n'avez pas besoin d'une nouvelle ligne, vous pouvez utiliser:

printf $(md5sum filename)


0

md5summet une barre oblique inverse avant le hachage s'il y a une barre oblique inverse dans le nom du fichier. Les 32 premiers caractères ou quoi que ce soit avant le premier espace peuvent ne pas être un hachage approprié. Cela ne se produira pas lors de l'utilisation de l'entrée standard (le nom du fichier sera juste -), donc la réponse de pixelbeat fonctionnera, mais beaucoup d'autres nécessiteront l'ajout de quelque chose comme | tail -c 32.


0

Eh bien, j'ai eu le même problème aujourd'hui, mais en essayant d'obtenir le hachage du fichier md5 lors de l'exécution de la findcommande. J'ai reçu la question la plus votée et l'ai enveloppée dans une fonction appelée md5à s'exécuter dans la commande find. La mission pour moi était de calculer le hachage pour tous les fichiers d'un dossier et de le sortir comme hash:filename.

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

Donc, j'avais quelques morceaux d'ici et aussi de find -exec une fonction shell?


0

Par souci d'exhaustivité, utilisez sed en utilisant regex et capture group:

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

L'expression regulare capture tout dans un groupe jusqu'à ce qu'un espace soit atteint. Pour que le groupe de capture fonctionne, vous devez tout capturer dans sed. (En savoir plus sur les groupes sed et caputer ici: https://stackoverflow.com/a/2778096/10926293 )
En tant que délimiteur dans sed, j'utilise des deux-points car ils ne sont pas valides dans les chemins de fichiers et je n'ai pas à échapper au slashed dans le chemin du fichier.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.