当归档某些数据时,我们将归档的 sha1 HASH 编码在文件名中,以确定归档的完整性。
我正在尝试找到一种通过从文件名中提取哈希来自动进行完整性检查的方法:
echo myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz | sed -n 's/^.*\([[:xdigit:]]{40}\).*$/\1/p'
echo myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz | sed -n 's/^.*\([0-9a-fA-F]{40}\).*$/\1/p'
上述两个测试均未返回结果。我错过了什么吗?
我更愿意显式地测试哈希值,而不是通过消除或位置来测试,因为文件名格式可能会有所不同。在任何情况下,散列都将由非散列字符分隔。
跟进:
谢谢您的帮助。
这是我想要创建的最终产品:
function checkhash () {
for f in "$@"
do
test -f $f || continue
export HASH=$(echo ${f}| grep -o '[0-9a-fA-F]\{32,128\}' )
case $(echo -n ${HASH} | wc -c) in
32)
echo "${HASH} *${f}" | md5sum -c -
;;
40)
echo "${HASH} *${f}" | sha1sum -c -
;;
56)
echo "${HASH} *${f}" | sha224sum -c -
;;
64)
echo "${HASH} *${f}" | sha256sum -c -
;;
96)
echo "${HASH} *${f}" | sha384sum -c -
;;
128)
echo "${HASH} *${f}" | sha512sum -c -
;;
*)
echo "No Identified HASH found in filename: ${f}"
;;
esac
done
}
答案1
您的示例表明哈希字符串在最右边的下划线 ( _
) 字符之后开始,在最左边的点 ( .
) 字符之前结束。
如果您不介意两步过程,您可以在 bash 中执行此操作,如下所示:
file_name="myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz"
name_hash="${file_name%%.*}"
hash="${name_hash##*_}"
echo "$hash"
产生
b7769c0e22c7f75b2935afad499852630ca83145
答案2
让我提供一些内容awk
:
echo myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz | awk -F'[_.]' '{print $3}'
答案3
也许使用 grep 会做更干净的工作:
$ a='myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz'
$ echo "$a" | grep -o '[0-9a-fA-F]\{40\}'
b7769c0e22c7f75b2935afad499852630ca83145
请注意,需要在 BRE 中{...}
引用。\{...\}
答案4
echo "myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz"|awk -F "_" '{gsub(/\..*/,"",$NF);print $NF}'
输出
b7769c0e22c7f75b2935afad499852630ca83145