![長話短說:](https://rvso.com/image/1575976/%E9%95%B7%E8%A9%B1%E7%9F%AD%E8%AA%AA%EF%BC%9A.png)
我有以下 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
。