Mam następujący skrypt 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
Ma porównać dwa pliki (obliczając ich skrót skrótu MD5), a następnie zgłosić, czy są różne. Pobiera pliki do porównania z listy.
Problem polega na tym, że jeśli plik, który próbuję odczytać, to np.
path/to/foo-orig.js
skrypt wyszuka plik pod adresem
path/to/foo.js-orig
i oczywiście powoduje to błąd i kończy się niepowodzeniem.
Jak poprawić ten błąd w skrypcie, aby .js
poprawnie obsługiwać rozszerzenie?
Edytować
TL; DR:
Biorąc pod uwagę ciąg, foo.bar
jak mogę uzyskać foo-orig.bar
?
Edycja2:
Dodam -orig
rozszerzenie, ponieważ ten projekt wymaga szablonu, który jest regularnie aktualizowany przez firmę zewnętrzną, a następnie nakładam na niego moje zmiany. Chcę więc śledzić, jakie pliki zmieniają, aby w razie potrzeby móc wrócić i dostosować kod.
lista-plików-do-porównania.txt wygląda następująco.
lista-plików-do-porównania.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
źródło
-orig
w pierwszej kolejności? Jak tolist-of-files-to-compare.txt
wygląda?Odpowiedzi:
W
Bash
można użyćPattern substitution
:Jeśli chcesz być bardziej ogólny, możesz najpierw uzyskać rozszerzenie
cut
irev
tak:A następnie zamień na
sed
:Byłoby łatwiej, gdybyś dołączył
.orig
nazwę pliku, aby taklogo.svg
się stałologo.svg.orig
.źródło