如何在bash脚本中正确处理.js扩展名?

时间:2018-11-30 07:48:31

标签: bash shell unix

我有以下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扩展名?

编辑

TL; DR:

给出一个字符串foo.bar,我怎么能得到foo-orig.bar

2 个答案:

答案 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

虽然未测试。我只是把它写在脑海里。