我使用md5sum为文件生成哈希值。但我只需要接收哈希值,而不是文件名。
md5=`md5sum ${my_iso_file}`
echo ${md5}
输出:
3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso
如何“剥离”文件名并仅保留该值?
一个简单的数组赋值就可以了……请注意,Bash 数组的第一个元素可以仅通过name
不带[0]
索引的 来寻址,即$md5
仅包含md5sum的 32 个字符。
md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
使用AWK:
md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
您可以使用cut
空格分隔行并仅返回第一个这样的字段:
md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
在 Mac OS X 上:
md5 -q file
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
单程:
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
or sed
。那么这是否真的重要是一个单独的问题;你可能很难注意到差异。
md5=$(md5sum < $file | tr -d ' -')
如果您需要打印它并且不需要换行符,您可以使用:
printf $(md5sum filename)
md5=`md5sum ${my_iso_file} | cut -b-32`
md5sum
如果文件名中有反斜杠,则在哈希之前放置一个反斜杠。第一个空格之前的前 32 个字符或任何内容可能不是正确的散列。
-
使用标准输入时不会发生这种情况(文件名只是| tail -c 32
.
通过依靠head
:
md5_for_file=`md5sum ${my_iso_file}|head -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
所以,我从这里得到了一些片段,也从Linux 中的“find -exec”一个 shell 函数中得到了一些片段
为了完整起见,使用正则表达式和捕获组的 sed 方法:
md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')
正则表达式捕获组中的所有内容,直到到达空格。要使捕获组正常工作,您需要捕获 sed 中的所有内容。
(有关 sed 和捕获组的更多信息:如何使用 sed 仅输出捕获的组?)
作为 sed 中的分隔符,我使用冒号,因为它们在文件路径中无效,而且我不必转义文件路径中的斜杠。
其他方式:
md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
md5=$(md5sum < index.html | head -c -4)