我有以下bash脚本。
while IFS= read -r filename;
do [[ $(md5 path/to/"$filename-orig") = $(md5 path/to/"$filename") ]] || echo $filename differs;
done < path/to/list-of-files-to-compare.txt
应该比较两个文件(通过计算它们的MD5哈希摘要),然后报告它们是否不同。它从列表中获取要比较的文件。
问题是,如果我要读取的文件位于例如
path/to/foo-orig.js
脚本将在以下位置查找文件
path/to/foo.js-orig
显然,这会引发错误并失败。
如何纠正脚本中的错误,以便正确处理.js
扩展名?
编辑
给出一个字符串foo.bar
,我怎么能得到foo-orig.bar
?
答案 0 :(得分:1)
如果我对您的理解正确,您实际上只是在问:给出一个字符串foo.bar
,我怎么能得到一个字符串foo-orig.bar
?可以这样做:
$ f="path/to/foo.js"
$ echo "${f%.js}-bak.js"
path/to/foo-bak.js
它记录在man bash
的 Parameter Expansion 下:
${parameter%word}
${parameter%%word}
删除匹配的后缀模式。单词被扩展以产生一个模式,就像路径名扩展一样。如果该模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式("%"
情况)或最长匹配模式({{1 }}大小写)。如果参数为"%%"
或@
,则将模式去除操作依次应用于每个位置参数,并且扩展为结果列表。如果parameter是下标为*
或@
的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。
答案 1 :(得分:0)
此示例将处理所有扩展名,甚至$ filename中没有扩展名的情况:
while IFS= read -r filename; do
if [[ $filename =~ ^(.*)([.].*)$ ]]; then
prefix=${BASH_REMATCH[1]}
suffix=${BASH_REMATCH[2]}
else
prefix=${filename}
suffix=''
fi
md5a=$(md5 -q "path/to/${prefix}-orig${suffix}")
md5b=$(md5 -q "path/to/${filename}")
[[ $md5a = $md5b ]] || echo $filename differs;
unset md5a
unset md5b
unset prefix
unset suffix
done < path/to/list-of-files-to-compare.txt
虽然未测试。我只是把它写在脑海里。