Apenas obtenha valor de hash usando md5sum (sem nome do arquivo)

176

Eu uso o md5sum para gerar um valor de hash para um arquivo. Mas eu só preciso receber o valor do hash, não o nome do arquivo.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Como posso retirar o nome do arquivo e permanecer apenas o valor?

John Doe
fonte
27
Muito surpreendente, isso não é uma opção para o md5sum.
Sridhar Sarnobat
11
Acordado! Por que isso não é uma opção? Um GNU-Master pode lançar alguma luz?
Rinogo 28/07/19
Por que você precisa ter um sinalizador "somente hash" quando pode aparar o resultado com alguma regex? (Eu sou sarcástico)
Magnetic_dud

Respostas:

163

Bem, de outra maneira :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
jyz
fonte
7
Ou md5=`md5sum < ${my_iso_file}` No entanto, isso ainda gera "-" no final. Mas para comparações isso deve ser suficiente.
Christophe De Troyer
Errado, ele fornece os seguintes resultados no Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71e seu código retorna MD5.
alper
Você pode executar -adicionando o | awk '{print $1}'final do seu código => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper
191

Uma simples atribuição de array funciona ... Observe que o primeiro elemento de um basharray pode ser endereçado apenas pelo namesem o [0]índice, ou seja, $md5contém apenas os 32 caracteres do md5sum.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
Peter.O
fonte
Impressionante. Apenas uma pergunta, eu sei que a pergunta está marcada bash, mas você pode me dizer se a matriz é um recurso somente do bash ou algum padrão de shell?
JYZ
a primeira linha não funciona dentro da seção do de um loop for ... como um Bash newb Eu ainda não sei por quê
Andy
@Andy: Se você tentar esta linha de código (no terminal, ou em um script): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Ele deve saída68b329da9893e34099c7d8ad5cb9c940
Peter.O
1
Como é echo ($(echo -n foo | md5sum))que não funciona? Erro bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav
2
@lkraav: O comando echo -n foo | md5sum gera 2 palavras shell para stdout : acbd18db4cc2f85cedef654fccc4a4d8e -(o -indica a fonte como stdin ). - Você deve dizer o bash para capturar essas palavras em uma string, usando comando de substituição : $( command ). - Os (colchetes )produzem uma matriz bash com 2 elementos. No entanto, você deve atribuir essa construção de matriz ( … )a um nome de variável; Por conseguinte, utilizando MD5 como o nome da matriz: md5=($(echo -n foo | md5sum)). Você não atribuiu a matriz para um nome de variável
Peter.O
57

Você pode usar cutpara dividir a linha em espaços e retornar apenas o primeiro tal campo:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
Brian Campbell
fonte
18
Oucut -c 1-32
Czarek Tomczak
7
@CzarekTomczak True, mas apenas usando o método desta resposta, você pode reutilizá-lo com algoritmos de hash diferentes, apenas alterando o próprio comando. md5sum-> sha256sumsem lembrar a quantidade de caracteres que você precisa "cortar".
David Tabernero M.
23

No Mac OS X:

md5 -q file
Trevor
fonte
não funciona no meu Mac OS X 10.7. Mas obrigado por postar, por qualquer versão em que isso funcione.
Sridhar Sarnobat
Também gmd5suma partir coreutilsiria trabalhar em MacOS como md5sumem outras respostas aqui mencionados.
Anton Tarasenko 21/11
14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
Gordon Davisson
fonte
Agradável. Uma observação - na primeira linha, você não precisa de aspas $()(embora elas não causem danos), mas certamente precisa delas ${}.
Roman Cheplyaka 13/09/10
1
@ Roman: sim, eu costumo citar habitualmente qualquer expansão (a menos que haja um motivo para não fazer) - é mais fácil do que acompanhar os casos em que é seguro pular as aspas. (Embora neste caso, deixei-los fora o nome do arquivo real ... espera para uma edição.)
Gordon Davisson
5

Mão única:

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

Outra maneira:

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

Outra maneira:

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

(Não tente fazer isso com back-ticks, a menos que você seja muito corajoso e muito bom com barras invertidas.)

A vantagem dessas soluções em relação a outras soluções é que elas apenas invocam md5sume o shell, em vez de outros programas como awkou sed. Se isso realmente importa é então uma questão separada; você provavelmente teria dificuldade em perceber a diferença.

Jonathan Leffler
fonte
4

Outra maneira é fazer:

md5sum filename |cut -f 1 -d " "

Cortar dividirá a linha em cada espaço e retornará apenas o primeiro campo.

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

Se você precisar imprimi-lo e não precisar de uma nova linha, poderá usar:

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

md5sumcoloca barra invertida antes do hash se houver barra invertida no nome do arquivo. Os primeiros 32 caracteres ou qualquer coisa antes do primeiro espaço podem não ser um hash adequado. Isso não acontecerá ao usar a entrada padrão (o nome do arquivo será apenas -), portanto a resposta do pixelbeat funcionará, mas muitos outros exigirão a adição de algo como | tail -c 32.

Wojciech
fonte
0

Bem, eu tive o mesmo problema hoje, mas tentando obter o arquivo md5 hash ao executar o findcomando. Eu recebi a pergunta mais votada e a envolvi em uma função chamada md5para executar no comando find. A missão para mim foi calcular o hash para todos os arquivos em uma pasta e gerá-lo 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

Então, eu peguei algumas peças daqui e também encontrei -exec uma função shell?

Fabio Montefuscolo
fonte
0

Por uma questão de integridade, uma maneira com o sed usando regex e grupo de captura:

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

A expressão regular está capturando tudo em um grupo até que um espaço seja alcançado. Para que o grupo de captura funcione, você precisa capturar tudo no sed. (Mais sobre os grupos sed e caputer aqui: https://stackoverflow.com/a/2778096/10926293 )
Como delimitador no sed, eu utilizo dois pontos porque eles não são válidos nos caminhos de arquivos e não preciso escapar dos cortes no caminho de arquivo.

FleMo
fonte
-3

Outra maneira:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
codaddict
fonte
-3
md5=$(md5sum < index.html | head -c -4)
Pausado até novo aviso.
fonte