Ottieni il valore hash solo usando md5sum (senza nome file)


176

Uso md5sum per generare un valore hash per un file. Ma ho solo bisogno di ricevere il valore hash, non il nome del file.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Come posso 'spogliare' il nome del file e rimanere solo il valore?


27
Molto sorprendente questa non è un'opzione per md5sum.
Sridhar Sarnobat,

11
Concordato! Perché questa non è un'opzione? Un GNU-Master può far luce?
Rinogo,

Perché devi avere un flag "solo hash" quando puoi tagliare il risultato con un po 'di regex? (I am sarcastic)
Magnetic_dud

Risposte:


163

Bene un altro modo :)

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

7
O md5=`md5sum < ${my_iso_file}` comunque questo alla fine restituisce "-". Ma per i confronti questo dovrebbe essere sufficiente.
Christophe De Troyer,

Sbagliato dà il seguente output su Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71e il tuo codice ritorna MD5.
alper,

È possibile ottenere serie di -aggiungendo | awk '{print $1}'fine del codice => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
Alper

191

Una semplice assegnazione di array funziona ... Notare che il primo elemento di un basharray può essere indirizzato solo dall'indice namesenza [0], ovvero $md5contiene solo i 32 caratteri di md5sum.

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

Eccezionale. Solo una domanda, so che la domanda è taggata bash, ma puoi dirmi se l'array è una funzione solo bash o uno standard di shell?
jyz,

la prima riga non funziona all'interno della sezione do di un ciclo for ... come newb di Bash non so ancora perché
Andy,

@Andy: se provi questa riga di codice (nel terminale o in uno script): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Dovrebbe essere visualizzato68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
Come echo ($(echo -n foo | md5sum))mai non funziona? Errori fuori bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav il

2
@lkraav: il comando echo -n foo | md5sum genera 2 parole shell su stdout : acbd18db4cc2f85cedef654fccc4a4d8e -(il -indica la sorgente come stdin ). - Devi dire bash per catturare quelle parole in una stringa, utilizzando Sostituzione di comando : $( command ). - Le (parentesi )producono un array bash con 2 elementi. Tuttavia, è necessario assegnare quel costrutto di array ( … )a un nome di variabile; quindi, utilizzando MD5 come il nome di matrice: md5=($(echo -n foo | md5sum)). Non hai assegnato l'array a un nome di variabile
Peter

57

Puoi usare cutper dividere la linea su spazi e restituire solo il primo di questi campi:

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

18
Oppurecut -c 1-32
Czarek Tomczak,

7
@CzarekTomczak Vero, ma solo usando il metodo di questa risposta, potresti riutilizzarlo con diversi algoritmi di hashing semplicemente modificando il comando stesso. md5sum-> sha256sumsenza ricordare la quantità di caratteri che devi "tagliare".
David Tabernero M.

23

Su Mac OS X:

md5 -q file

non funziona su Mac OS X 10.7. Ma grazie per la pubblicazione, per qualunque versione funzioni.
Sridhar Sarnobat,

Anche gmd5sumda coreutilsfunzionerebbe su MacOS come md5sumin altre risposte menzionate qui.
Anton Tarasenko,

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

Bello. Una nota: sulla prima riga non hai bisogno di virgolette $()(anche se non fanno male) ma sicuramente ne hai bisogno ${}.
Roman Cheplyaka,

1
@Roman: sì, tendo a citare abitualmente qualsiasi espansione (a meno che non ci sia un motivo per non farlo) - è più facile che tenere traccia dei casi in cui è sicuro saltare le virgolette. (Anche se in questo caso, li ho lasciati fuori dal nome del file effettivo ... in attesa di una modifica.)
Gordon Davisson

5

Senso unico:

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

Un altro modo:

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

Un altro modo:

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

(Non provarlo con le zecche posteriori a meno che non siate molto coraggiosi e molto bravi con le barre rovesciate.)

Il vantaggio di queste soluzioni rispetto ad altre soluzioni è che invocano solo md5sume la shell, piuttosto che altri programmi come awko sed. Se ciò che conta davvero è quindi una domanda separata; probabilmente saresti molto difficile notare la differenza.


4

Un altro modo è fare:

md5sum filename |cut -f 1 -d " "

Taglia dividerà la linea in ogni spazio e restituirà solo il primo campo.



2

Se è necessario stamparlo e non è necessaria una nuova riga, è possibile utilizzare:

printf $(md5sum filename)


0

md5summette la barra rovesciata prima dell'hash se è presente una barra rovesciata nel nome del file. I primi 32 caratteri o qualcosa del genere prima del primo spazio potrebbero non essere un hash corretto. Non accadrà quando si utilizza l'input standard (il nome del file sarà solo -), quindi la risposta di pixelbeat funzionerà, ma molti altri richiederanno l'aggiunta di qualcosa di simile | tail -c 32.


0

Bene, ho avuto lo stesso problema oggi, ma cercando di ottenere l'hash del file md5 durante l'esecuzione del findcomando. Ho ricevuto la domanda più votata e la ho racchiusa in una funzione chiamata md5per eseguire il comando find. La missione per me era calcolare l'hash per tutti i file in una cartella e inviarlo come hash:filename.

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

Quindi, ho avuto alcuni pezzi da qui e anche da find -exec una funzione shell?


0

Per completezza un modo con sed usando regex e il gruppo di acquisizione:

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

L'espressione regulare sta catturando tutto in un gruppo fino a raggiungere uno spazio. Per far funzionare il gruppo di acquisizione devi catturare tutto in sed. (Maggiori informazioni sui gruppi sed e caputer qui: https://stackoverflow.com/a/2778096/10926293 )
Come delimitatore in sed uso i due punti perché non sono validi nei percorsi dei file e non devo sfuggire al taglio nel percorso del file.


-3

Un altro modo:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.