Solo obtenga valor hash usando md5sum (sin nombre de archivo)

176

Yo uso md5sum para generar un valor hash para un archivo. Pero solo necesito recibir el valor hash, no el nombre del archivo.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

¿Cómo puedo 'quitar' el nombre del archivo y solo seguir siendo el valor?

John Doe
fuente
27
Muy sorprendente, esta no es una opción para md5sum.
Sridhar Sarnobat
11
¡Convenido! ¿Por qué no es esta una opción? ¿Puede un maestro GNU arrojar algo de luz?
rinogo
¿Por qué necesita tener un indicador de "solo hash" cuando puede recortar el resultado con algunas expresiones regulares? (Soy sarcástico)
Magnetic_dud

Respuestas:

163

Bueno, otra forma :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
jyz
fuente
77
O, sin md5=`md5sum < ${my_iso_file}` embargo, esto aún genera "-" al final. Pero para las comparaciones esto debería ser suficiente.
Christophe De Troyer
Incorrecto da el siguiente resultado en Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71y su código vuelve MD5.
Alper
Puede obtener racha de -mediante la adición | awk '{print $1}'final de su código => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
Alper
191

Una asignación de matriz simple funciona ... Tenga en cuenta que el primer elemento de una bashmatriz se puede abordar simplemente namesin el [0]índice, es decir, $md5contiene solo los 32 caracteres de md5sum.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
Peter.O
fuente
Increíble. Solo una pregunta, sé que la pregunta está etiquetada bash, pero ¿puede decirme si la matriz es una característica solo de bash o algún estándar de shell?
jyz
la primera línea no funciona dentro de la sección do de un bucle for ... como Bash newb todavía no sé por qué
Andy
@Andy: Si prueba esta línea de código (en la terminal o en un script): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Debería salir68b329da9893e34099c7d8ad5cb9c940
Peter.O
1
¿Cómo echo ($(echo -n foo | md5sum))es que no funciona? Errores bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav
2
@lkraav: el comando echo -n foo | md5sum genera 2 palabras de shell para stdout : acbd18db4cc2f85cedef654fccc4a4d8y -( -indica la fuente como stdin ). - Debe informar fiesta para capturar esas palabras en una cadena, usando comando de sustitución : $( command ). - Los (corchetes )producen una matriz bash con 2 elementos. Sin embargo, debe asignar esa construcción de matriz ( … )a un nombre de variable; por lo tanto, utilizando MD5 como el nombre de la matriz: md5=($(echo -n foo | md5sum)). No ha asignado la matriz a un nombre de variable
Peter
57

Puede usar cutpara dividir la línea en espacios y devolver solo el primer campo:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
Brian Campbell
fuente
18
Ocut -c 1-32
Czarek Tomczak
77
@CzarekTomczak Verdadero, pero con solo usar el método de esta respuesta, puede reutilizarlo con diferentes algoritmos de hash simplemente cambiando el comando en sí. md5sum-> sha256sumsin recordar qué cantidad de caracteres necesitas "cortar".
David Tabernero M.
23

En Mac OS X:

md5 -q file
trevor
fuente
no funciona en mi Mac OS X 10.7. Pero gracias por publicar, para cualquier versión en la que funcione.
Sridhar Sarnobat
También gmd5sumdesde coreutilsfuncionaría en MacOS como md5sumen otras respuestas que se mencionan aquí.
Anton Tarasenko
14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
Gordon Davisson
fuente
Agradable. Una nota: en la primera línea no necesita comillas $()(aunque no hacen daño) pero ciertamente las necesita ${}.
Roman Cheplyaka
1
@Roman: sí, tiendo a citar habitualmente cualquier expansión (a menos que haya una razón para no hacerlo): es más fácil que hacer un seguimiento de los casos en los que es seguro omitir las citas. (Aunque en este caso, los dejé fuera del nombre de archivo real ... espera una edición).
Gordon Davisson,
5

De una sola mano:

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

De otra manera:

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

De otra manera:

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

(No intente eso con tick backs a menos que sea muy valiente y muy bueno con las barras invertidas).

La ventaja de estas soluciones sobre otras soluciones es que solo invocan md5sumy el shell, en lugar de otros programas como awko sed. Si eso realmente importa es entonces una pregunta separada; probablemente te costará notar la diferencia.

Jonathan Leffler
fuente
4

Otra forma es hacer:

md5sum filename |cut -f 1 -d " "

El corte dividirá la línea en cada espacio y devolverá solo el primer campo.

azerttyu
fuente
2
md5=$(md5sum < $file | tr -d ' -')
pixelbeat
fuente
2

Si necesita imprimirlo y no necesita una nueva línea, puede usar:

printf $(md5sum filename)
Alex
fuente
1
md5=`md5sum ${my_iso_file} | cut -b-32`
letronje
fuente
0

md5sumcoloca una barra diagonal inversa antes del hash si hay una barra diagonal inversa en el nombre del archivo. Los primeros 32 caracteres o cualquier cosa antes del primer espacio pueden no ser un hash adecuado. No sucederá cuando se use la entrada estándar (el nombre del archivo será solo -), por lo que la respuesta de pixelbeat funcionará, pero muchos otros requerirán agregar algo como | tail -c 32.

Wojciech
fuente
0

Bueno, tuve el mismo problema hoy, pero tratando de obtener el hash del archivo md5 al ejecutar el findcomando. Obtuve la pregunta más votada y la envolví en una función llamada md5a ejecutar en el comando find. La misión para mí fue calcular el hash para todos los archivos en una carpeta y generarlo como hash:filename.

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

Entonces, ¿obtuve algunas piezas de aquí y también de find -exec a shell function?

Fabio Montefuscolo
fuente
0

En aras de la exhaustividad, una forma con sed usando regex y capture group:

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

La expresión regular es capturar todo en un grupo hasta que se alcanza un espacio. Para que el grupo de captura funcione, debe capturar todo en sed. (Más información sobre los grupos sed y caputer aquí: https://stackoverflow.com/a/2778096/10926293 )
Como delimitador en sed, uso dos puntos porque no son válidos en las rutas de archivo y no tengo que escapar de la barra. ruta de archivo.

FleMo
fuente
-3

De otra manera:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
codictorio
fuente
-3
md5=$(md5sum < index.html | head -c -4)
Pausado hasta nuevo aviso.
fuente