检查文件名是否为以下形式。

检查文件名是否为以下形式。

在 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进行摄取,这是通过<()构造完成的。

相关内容