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

Joh*_*Doe 158 bash shell md5sum

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

md5=`md5sum ${my_iso_file}`
echo ${md5}
Run Code Online (Sandbox Code Playgroud)

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

我怎样才能"删除"文件名并仅保留值?

Pet*_*r.O 177

一个简单的数组赋值工作...请注意,数组的第一个元素bash可以通过name没有[0]索引来解决,即$md5只包含md5sum的32个字符.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
Run Code Online (Sandbox Code Playgroud)

  • 这是一个 bash 问题,但请注意,这在 zsh 中不起作用。相反,你可以 `echo $md5[1]` 来仅获取哈希值(但这不能移植到 bash)... (4认同)
  • 第一行在 for 循环的 do 部分不起作用......作为 Bash newb 我还不知道为什么 (2认同)
  • @lkraav:*命令*`echo -n foo | md5sum`输出2个壳*话*到*标准输出*:`acbd18db4cc2f85cedef654fccc4a4d8`和`-`(在`-`指示源为*标准输入*). - 你必须告诉*bash*使用*Command Substitution*:`$(command)`将这些*words*捕获到一个字符串中. - `(`bracket`)`生成一个带有2个元素的*bash数组*.但是,您必须将该数组构造`(...)`赋值给变量名; 因此,使用MD5**作为阵列名称:`MD5 =($(回波-n FOO |的md5sum))`.您尚未将数组分配给变量名称 (2认同)

jyz*_*jyz 147

那么另一种方式:)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
Run Code Online (Sandbox Code Playgroud)

  • 或者``md5 =`md5sum <$ {my_iso_file}```但是这仍然在结尾输出" - ".但是对于比较,这应该足够了. (7认同)

Bri*_*ell 50

您可以使用cut在空格上拆分线并仅返回第一个这样的字段:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
Run Code Online (Sandbox Code Playgroud)

  • 或者`cut -c 1-32` (17认同)
  • @CzarekTomczak是的,但是只需使用此答案的方法,只需更改命令本身,即可将其与其他哈希算法一起使用。`md5sum`-&gt;`sha256sum`,而不记得您需要“剪切”多少字符。 (3认同)

小智 22

在Mac OS X上:

md5 -q file
Run Code Online (Sandbox Code Playgroud)


Gor*_*son 14

md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
Run Code Online (Sandbox Code Playgroud)

  • @Roman:是的,我倾向于习惯性地引用任何扩展(除非有理由不这样做)——这比跟踪可以安全地跳过引号的情况更容易。(尽管在这种情况下,我没有保留它们的实际文件名......等待编辑。) (2认同)

Vla*_*cic 10

通过依靠head

md5_for_file=`md5sum ${my_iso_file}|head -c 32`
Run Code Online (Sandbox Code Playgroud)


小智 8

另一种方法是:

md5sum filename | cut -f 1 -d " "
Run Code Online (Sandbox Code Playgroud)

cut会将行拆分为每个空格并仅返回第一个字段。


小智 7

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

printf $(md5sum filename)
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 5

单程:

set -- $(md5sum $file)
md5=$1
Run Code Online (Sandbox Code Playgroud)

其他方式:

md5=$(md5sum $file | while read sum file; do echo $sum; done)
Run Code Online (Sandbox Code Playgroud)

其他方式:

md5=$(set -- $(md5sum $file); echo $1)
Run Code Online (Sandbox Code Playgroud)

(除非你非常勇敢且非常善于使用反斜杠,否则不要尝试使用反斜杠.)

这些解决方案优于其他解决方案的优点是它们只调用md5sumshell而不是其他程序,如awksed.这实际上是否重要是一个单独的问题; 你可能很难注意到差异.