只使用md5sum获取哈希值(没有文件名)

我使用md5sum为文件生成哈希值。 但是我只需要接收哈希值,而不是文件名
md5=`md5sum ${my_iso_file}`
echo ${md5}

输出:

3abb17b66815bc7946cefe727737d295  ./iso/somefile.iso

我如何“剥离”文件名,只保留值?

171531 次浏览

你可以使用cut在空格上分割行并只返回第一个字段:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
md5=`md5sum ${my_iso_file} | cut -b-32`
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"

另一种方法:

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

使用AWK:

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
md5=$(md5sum < index.html | head -c -4)

一个方法:

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

另一种方法:

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

另一种方法:

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

(不要尝试用反斜杠,除非你非常勇敢并且非常擅长反斜杠。)

这些解决方案相对于其他解决方案的优点是,它们只调用md5sum和shell,而不调用其他程序,如awksed。那么,这是否真的重要就另当别论了;你可能很难注意到其中的区别。

在Mac OS X上:

md5 -q file
md5=$(md5sum < $file | tr -d ' -')

一个简单的数组赋值工作…注意Bash数组的第一个元素可以用name来寻址,而不需要[0]索引,也就是说,$md5只包含md5sum的32个字符。

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

另一种方法是:

md5sum filename | cut -f 1 -d " "

减少将行分割为每个空格,只返回第一个字段。

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

printf $(md5sum filename)

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

当使用标准输入时(文件名将只是-),它不会发生,所以pixelbeat的回答可以工作,但许多其他将需要添加类似| tail -c 32的东西。

好吧,我今天遇到了同样的问题,但我在运行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'Linux中的shell函数中获得了一些片段

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

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

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

(更多关于sed和捕获组的信息:我如何用sed只输出捕获的组?< / >)

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

通过依赖head:

md5_for_file=`md5sum ${my_iso_file}|head -c 32`

如果你担心文件名不正常:

md5sum < "${file_name}" | awk NF=1
f244e67ca3e71fff91cdf9b8bd3aa7a5

其他更混乱的处理方法:

md5sum "${file_name}" | awk NF=NF OFS= FS=' .*$'
or
| awk '_{ exit }++_' RS=' '
f244e67ca3e71fff91cdf9b8bd3aa7a5

完全在awk中完成:

mawk 'BEGIN {
__ = ARGV[ --ARGC ]
_ = sprintf("%c",(_+=(_^=_<_)+_)^_+_*++_)
RS = FS
gsub(_,"&\\\\&",__)


( _=" md5sum < "((_)(__)_) ) | getline


print $(_*close(_)) }' "${file_name}"
f244e67ca3e71fff91cdf9b8bd3aa7a5