总结:

总结:

我有以下 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 如下所示。

要比较的文件列表.txt
public/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

相关内容