在 Bash 中,如何最轻松地检查常规文件的文件名是否具有下面显示的格式?
<filename>.<md5sum of file content>
例如,假设我有一个文件,其原始名称是foo.txt内容如下:
你好世界
该文件的 md5sum 为:
f0ef7081e1539ac00ef5b761b4fb01b3
因此,我已将文件名更改为:
foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3
在 Bash 中,我如何才能最好地进行必要的字符串处理,以验证文件名最后一个点之后的部分确实是文件内容的 md5sum?
答案1
考虑一个 bash 脚本,其中将要测试的文件名作为参数给出:
./script.sh filename.f0ef7081e1539ac00ef5b761b4fb01b3
内容script.sh
:
#!/bin/bash
#Get the md5 value from the filename (get the substring after the last '.' character)
expectedMD5=${1##*.}
#Calculate the md5sum value of the file
realMD5=$( md5sum $1 | awk '{ print $1 }' )
#Compare the 2 values
if [ $expectedMD5 = $realMD5 ]
then
echo 'OK !'
else
echo 'NOT OK'
fi
答案2
@Félicien 写的是答案的要点。我只是想补充md5sum
一下确认模式:
md5sum [OPTION]... [FILE]... -c, --check read MD5 sums from the FILEs and check them
你可以按如下方式使用它。假设f
包含文件名,那么
md5sum -c <( echo "${f##*.}" $f )
打印出来
foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3: OK
这使用了一个称为流程替代本质上,该命令首先执行
echo "${f##*.}" $f
打印出来
f0ef7081e1539ac00ef5b761b4fb01b3 foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3
但是由于md5sum -c
它是从文件而不是标准输入获取输入的,因此需要将输出echo
引导到一个临时位置以便md5sum
进行摄取,这是通过<()
构造完成的。