Zamiana pełnych łańcuchów znaków

Mam do napisania skrypt, który zamienia rozszerzenie na dowolne inne podane jako argument skryptu. Chciałem użyć funkcję tr ale nie działa do końca tak jak chciałem.

zdjecie.jpg | tr ".jpg" ".png"

Czego wynikiem jest zdpecie.png czyli zmienia również nazwę pliku co nie jest pożądanym efektem. Czy jest możliwość aby funkcja zmieniała cały łańcuch znaków dopiero gdy znajdzie dokładnie taki łańcuch jaki został podany jako pierwszy argument funkcji tr? W jaki sposób można to zrobić jak najprościej?

Z góry dziękuję za odpowiedź.

tr się do tego nie nadaje. Ale jest rename:

rename 's/(.*)\.jpg/$1.png/'

Ale w jaki sposób zachować stare nazwy plików? Nie do końca rozumiem jak to działa.

for nazwa in *.jpg

do

  cp $nazwa "${nazwa%.*}.$1"

done

nie sprawdzałem, pisałem z pamięci

Zrobiłem to tak:

#! /bin/bash

#szukane rozszerzenie

rozszukane=$1;

#rozszerzenie, na ktore ma zostac zmienione szukane

rozdozamiany=$2;


#utworzenie listy plikow z szukanym rozszerzeniem

pliki=$(ls | grep "\.$rozszukane");


#zamiana rozszerzenia w liscie plikow na to podane jako drugi argument

for plik in $pliki

do

        mv $plik ${plik%.*}.$rozdozamiany

done
mv $plik ${plik%.*}.$rozdozamiany

Tak więc sam sobie zaprzeczyłeś :wink: