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

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

输出:

3abb17b66815bc7946cefe727737d295  ./iso/somefile.iso

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


当前回答

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

其他回答

另一种方法是:

md5sum filename | cut -f 1 -d " "

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

在Mac OS X上:

md5 -q file

一个方法:

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

另一种方法:

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

另一种方法:

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

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

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

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

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

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

(关于sed和捕获组的更多信息请参见:如何使用sed只输出捕获的组?)

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

靠在头上:

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