我有以下 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
?
编辑2:
我添加-orig
扩展是因为这个项目采用了第三方定期更新的模板,然后我将我的更改覆盖到该模板上。因此,我想跟踪他们更改了哪些文件,以便在必要时可以返回并调整我的代码。
list-of-files-to-compare.txt 如下所示。
要比较的文件列表.txtpublic/assets/images/logos/logo.svg
README.md
src/auth/Auth.js
src/auth/store/actions/login.actions.js
src/auth/store/actions/user.actions.js
src/auth/store/reducers/user.reducer.js
src/firebaseService/firebaseService.js
src/firebaseService/firebaseServiceConfig.js
src/fuse-configs/fuseNavigationConfig.js
src/fuse-configs/fuseRoutesConfig.js
src/index.js
src/main/content/components/ComponentsConfig.js
src/main/content/login/Login.js
src/store.js
src/store/actions/index.js
src/store/reducers/index.js
答案1
您Bash
可以使用Pattern substitution
:
while IFS= read -r filename;
do
echo ${filename/.js/-orig.js}
done < list-of-files-to-compare.txt
如果你想要更通用,你可以首先获得一个扩展,cut
如下rev
所示:
$ ext=$(echo public/assets/images/logos/logo.svg | rev | cut -d. -f1 | rev)
$ echo $ext
svg
然后将其替换为sed
:
$ echo public/assets/images/logos/logo.svg | sed "s,\.${ext}\$,-orig.${ext},"
public/assets/images/logos/logo-orig.svg
.orig
如果将其附加到文件名中,这样会更容易,因为它logo.svg
会变成logo.svg.orig
。