仅使用md5sum获取哈希值(不带文件名)


176

我使用md5sum为文件生成哈希值。但是我只需要接收哈希值,而不是文件名。

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

我如何“剥离”文件名并仅保留其值?


27
非常令人惊讶的是,这不是md5sum的选项。
Sridhar Sarnobat

11
同意! 为什么这不是一个选择?GNU-Master可以阐明一些吗?
rinogo

当您可以使用某些正则表达式修剪结果时,为什么需要有一个“仅哈希”标志?(我很讽刺)
Magnetic_dud,

Answers:


163

那么另一种方式:)

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

7
md5=`md5sum < ${my_iso_file}` 但是,它仍然在末尾输出“-”。但是为了进行比较,这应该足够了。
Christophe De Troyer

错误的在Mac上给出以下输出MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71,您的代码返回MD5
alper

您可以-通过添加| awk '{print $1}'代码结尾=> md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper 18'Aug

191

一个简单的数组赋值工作...请注意,数组的第一个元素bash可以通过name不带[0]索引的来寻址,即,$md5仅包含md5sum的32个字符。

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

太棒了 只是一个问题,我知道这个问题是带标签的bash,但是您能告诉我array是仅bash功能还是某些shell标准?
jyz 2014年

第一行在for循环的do部分中不起作用...作为Bash newb,我还不知道为什么
Andy

@Andy:如果您尝试此行代码(在终端或脚本中):echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done-应该输出68b329da9893e34099c7d8ad5cb9c940
Peter.O,2015年

1
怎么echo ($(echo -n foo | md5sum))不起作用?错误信息出炉 bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav 2015年

2
@lkraav:该命令将 echo -n foo | md5sum两个shell 输出到stdoutacbd18db4cc2f85cedef654fccc4a4d8--将源表示为stdin)。-你必须告诉bash中捕捉那些转换成字符串,使用命令替换$( command )。– (括号)产生一个包含2个元素的bash数组。但是,您必须将该数组构造分配给( … )变量名。因此,使用md5作为数组名称:md5=($(echo -n foo | md5sum))。您尚未将数组分配给变量名
Peter.O,2015年

57

您可以用于cut在空格处分割线,并仅返回第一个此类字段:

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

18
cut -c 1-32
Czarek Tomczak 2014年

7
@CzarekTomczak是的,但是仅通过使用此答案的方法,您只需更改命令本身即可将其与其他哈希算法一起使用。md5sum-> sha256sum无需记住您需要“剪切”多少字符。
David Tabernero M.

23

在Mac OS X上:

md5 -q file

在Mac OS X 10.7上不起作用。但是感谢您的发布,无论其适用于哪个版本。
Sridhar Sarnobat

此外gmd5sum,从coreutils将在MacOS工作就像md5sum在这里提到的其他答案。
安东·塔拉申科

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

真好 请注意-在第一行中,您不需要引号$()(尽管它们无害),但肯定需要引号${}
Roman Cheplyaka

1
@Roman:是的,我倾向于习惯性地引用任何扩展名(除非有理由不这样做),这比跟踪可以安全地跳过引号的情况要容易得多。(尽管在这种情况下,我将它们保留了实际的文件名……待命进行编辑。)
Gordon Davisson 2010年

5

单程:

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

其他方式:

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

其他方式:

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

(除非您非常勇敢并且反斜杠非常好,否则不要尝试使用反斜杠。)

与其他解决方案相比,这些解决方案的优势在于它们仅调用md5sum和shell,而不调用诸如awkor的其他程序sed。那么这是否真正重要是一个单独的问题。您可能会很难发现差异。


4

另一种方法是:

md5sum filename |cut -f 1 -d " "

剪切会将线分割到每个空格,仅返回第一个字段。



2

如果需要打印并且不需要换行符,则可以使用:

printf $(md5sum filename)


0

md5sum如果文件名中有反斜杠,则将反斜杠放在哈希之前。前32个字符或第一个空格之前的任何内容可能不是正确的哈希。当使用标准输入(文件名为-)时,它不会发生,因此pixelbeat的答案将起作用,但许多其他要求添加诸如的内容| tail -c 32


0

好吧,我今天遇到了同样的问题,但是在运行find命令时尝试获取文件md5哈希。我得到了投票最多的问题,并将其包装在一个称为md5在find命令中运行的函数中。对我来说,任务是计算文件夹中所有文件的哈希值,并将其输出为hash:filename

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

因此,我从这里以及find -exec shell函数中得到了一些东西


-1

为了完整性,使用正则表达式和捕获组使用sed的方法:

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

正则表达式将捕获组中的所有内容,直到达到一个空格为止。要使捕获组正常工作,您需要捕获sed中的所有内容。(有关sed和caputer组的更多信息,请点击这里:https ://stackoverflow.com/a/2778096/10926293 )
作为sed中的定界符,我使用冒号,因为它们在文件路径中无效,并且我不必转义斜线文件路径。


-3

其他方式:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.