223

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

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

输出:

3abb17b66815bc7946cefe727737d295  ./iso/somefile.iso

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

4

16 回答 16

226

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

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
于 2011-04-24T22:47:41.480 回答
213

使用AWK

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
于 2010-09-09T19:16:27.473 回答
70

您可以使用cut空格分隔行并仅返回第一个这样的字段:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
于 2010-09-09T18:11:51.837 回答
29

在 Mac OS X 上:

md5 -q file
于 2010-09-10T07:56:32.843 回答
17
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
于 2010-09-09T18:22:17.563 回答
9

另一种方法是:

md5sum filename | cut -f 1 -d " "

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

于 2015-05-23T09:31:18.210 回答
6

单程:

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。那么这是否真的重要是一个单独的问题;你可能很难注意到差异。

于 2010-09-09T20:09:20.503 回答
3
md5=$(md5sum < $file | tr -d ' -')
于 2010-09-10T15:46:02.653 回答
3

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

printf $(md5sum filename)
于 2016-09-15T05:16:15.857 回答
2
md5=`md5sum ${my_iso_file} | cut -b-32`
于 2010-09-09T18:14:26.070 回答
1

md5sum如果文件名中有反斜杠,则在哈希之前放置一个反斜杠。第一个空格之前的前 32 个字符或任何内容可能不是正确的散列。

-使用标准输入时不会发生这种情况(文件名只是| tail -c 32.

于 2016-12-30T12:29:05.520 回答
1

通过依靠head

md5_for_file=`md5sum ${my_iso_file}|head -c 32`
于 2021-07-28T11:34:27.683 回答
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

所以,我从这里得到了一些片段,也从Linux 中的“find -exec”一个 shell 函数中得到了一些片段

于 2018-01-05T18:03:45.473 回答
0

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

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

正则表达式捕获组中的所有内容,直到到达空格。要使捕获组正常工作,您需要捕获 sed 中的所有内容。

(有关 sed 和捕获组的更多信息:如何使用 sed 仅输出捕获的组?

作为 sed 中的分隔符,我使用冒号,因为它们在文件路径中无效,而且我不必转义文件路径中的斜杠。

于 2019-05-17T08:50:50.763 回答
-3

其他方式:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
于 2010-09-09T18:23:42.603 回答
-3
md5=$(md5sum < index.html | head -c -4)
于 2010-09-09T19:49:16.580 回答