我使用md5sum为文件生成哈希值。 但我只需要接收哈希值,而不是文件名。
md5=`md5sum ${my_iso_file}`
echo ${md5}
3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso
如何“删除”文件名并仅保留值?
答案 0 :(得分:168)
简单的数组赋值有效...请注意,bash
数组的第一个元素只能通过name
而不是[0]
索引来处理,即{{1} }只包含md5sum的32个字符。
$md5
答案 1 :(得分:142)
另一种方式:)
md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
答案 2 :(得分:49)
您可以使用cut
拆分空格中的行并仅返回第一个此类字段:
md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
答案 3 :(得分:22)
在Mac OS X上:
md5 -q file
答案 4 :(得分:14)
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
答案 5 :(得分: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,而不是awk
或sed
等其他程序。这实际上是否重要是一个单独的问题;你可能很难注意到差异。
答案 6 :(得分:3)
另一种方法是:
md5sum filename |cut -f 1 -d " "
剪切将分割到每个空格并仅返回第一个字段。
答案 7 :(得分:3)
如果您需要打印并且不需要换行,可以使用:
printf $(md5sum filename)
答案 8 :(得分:2)
md5=$(md5sum < $file | tr -d ' -')
答案 9 :(得分:0)
md5=`md5sum ${my_iso_file} | cut -b-32`
答案 10 :(得分:0)
md5sum
会在哈希之前放入反斜杠。在第一个空格之前的前32个字符或任何内容可能不是正确的哈希。使用标准输入时不会发生这种情况(文件名只是 - ),因此pixelbeat's answer会起作用,但许多其他人需要添加类似| tail -c 32
的内容。
答案 11 :(得分: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 a shell function?
得到了一些作品答案 12 :(得分:0)
依靠head
:
md5_for_file=`md5sum ${my_iso_file}|head -c 32`
答案 13 :(得分:-1)
为了完整起见,使用正则表达式和捕获组使用sed的方法:
md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')
正则表达式将捕获组中的所有内容,直到达到空格为止。要使捕获组正常工作,您需要捕获sed中的所有内容。
(有关sed和Caputer组的更多信息,请访问https://stackoverflow.com/a/2778096/10926293)
作为sed中的定界符,我使用冒号,因为它们在文件路径中无效,而且我不必在文件路径中转义斜线。
答案 14 :(得分:-3)
另一种方式:
md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
答案 15 :(得分:-3)
md5=$(md5sum < index.html | head -c -4)