onsdag 22 september 2010

Bash. Byt filändelse eller förändra filnamnet.

Här visar jag lite olika lösningnar på hur man kan ändra namnen på filerna.

Om man tex vill byta alla *.JPG till att bli *.jpg så kan man göra det så här, först kolla man vilka filer som kommer att ändras:
for filnamn in *.JPG; do filnamn=./"${filnamn// /\\ }"; echo "$filnamn" '->' "${filnamn/.JPG/.jpg}";done

Denna del filnamn=./"${filnamn// /\\ }" sätter in en \ före alla melanslag i filnamnet och skriver över grundvariabeln filnamn med det nya värdet. /. delen ser till så att ett namn som startar med ett bindesträck inte av misstag tolkas som en flagga till kommandot. När man sedan kör mv och omsluter filnamnen med " " så lägger mv in \ där det behövs automatiskt och man behöver inte försöka att själv hantera mellanslagen i filnamnen.

Om det är de filer man vill ändra så gör man ändrinFetgen så här:
for filnamn in *.JPG; do mv -v ./"$filnamn" ./"${filnamn/.JPG/.jpg}";done

-v gör att det visas vilka filer som har bytt namn.

Några varianter med förklaringar:

echo $s
.jpghej.jpg
Så ser variabeln s ut i sin grund .

echo ${s/.jpg/.JPG}
.JPGhej.jpg
Byter ut första

echo ${s//.jpg/.JPG}
.JPGhej.JPG
Byter ut alla(även om det fanns en i mitten)

echo ${s/%.jpg/.JPG}
.jpghej.JPG
Byter ut den sista (även om det fanns en i mitten)

om man skippar utbytesdelen så tar man helt enkelt bort den/de delar som man annars förändrade.