Denne artikkelen tar for seg en kraftfull kommando for filomdøping i Linux-verdenen, og gir deg muligheten til å ta en pause fra den mer tradisjonelle `mv`-kommandoen. Kommandoen `rename` er fleksibel, rask og ofte enklere i bruk. Her er en guide til hvordan du kan utnytte denne kommandoens potensial.
Hvorfor ikke bare bruke `mv`?
`mv`-kommandoen er på ingen måte dårlig. Den gjør jobben sin utmerket, og finnes tilgjengelig på alle Linux-distribusjoner, macOS og andre Unix-lignende systemer. Den er alltid lett tilgjengelig. Likevel, noen ganger trenger man en «bulldoser», ikke bare en spade.
`mv`-kommandoen sin hovedfunksjon er å flytte filer. En positiv bieffekt er at den kan flytte en eksisterende fil til en ny fil med et annet navn. Dette gir samme effekt som å omdøpe filen, og er dermed en løsning vi kan bruke. Men `mv` er egentlig ikke et dedikert verktøy for å omdøpe filer.
Omdøpe en enkelt fil med `mv`
For å omdøpe en fil med `mv`, skriver du inn `mv`, etterfulgt av et mellomrom, navnet på filen, et nytt mellomrom og det nye filnavnet. Trykk deretter Enter.
Du kan bruke `ls` for å bekrefte at filen har blitt omdøpt.
mv gammelFil.txt nyFil.txt
ls *.txt
Omdøpe flere filer med `mv`
Det blir mer komplisert når du ønsker å omdøpe flere filer. `mv` er ikke utviklet for å håndtere omdøping av flere filer samtidig. Da må du bruke mer avanserte Bash-triks. Dette kan være greit for de som er erfarne med kommandolinjen, men kompleksiteten med `mv` står i kontrast til hvor enkelt det er å omdøpe en enkelt fil.
Komplikasjonene kan fort eskalere.
La oss anta at vi har en katalog med diverse filer, inkludert noen med filtypen «.prog». Vi ønsker å omdøpe disse filene slik at de får filtypen «.prg» i stedet.
Hvordan kan vi få `mv` til å gjøre dette for oss? La oss først se på filene.
ls *.prog -l
Her er en måte å gjøre det på uten å skrive en egen Bash-skriptfil:
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
Fungerte det? La oss sjekke filene.
ls *.pr*
Ja, det fungerte. Alle filene har nå filtypen «.prg», og det finnes ingen filer med filtypen «.prog» i katalogen.
Hva skjedde nå?
Hva gjorde egentlig den lange kommandoen? La oss dele den opp.
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done
Den første delen starter en løkke som behandler hver «.prog»-fil i katalogen.
Den neste delen beskriver hva behandlingen skal gjøre. Den bruker `mv` for å flytte hver fil til en ny fil. Det nye filnavnet består av det opprinnelige filnavnet, men uten «.prog»-delen, som erstattes med en ny filtype «.prg».
Finnes det en enklere måte?
Sannsynligvis. Ja, det finnes, og det er `rename`-kommandoen.
`rename` er ikke inkludert i alle Linux-distribusjoner som standard, så du må installere den. Den kan også ha forskjellige navn i ulike Linux-familier, men de fungerer i hovedsak på samme måte. Bare sørg for å bruke riktig kommandonavn for din spesifikke Linux-variant.
For Ubuntu og Debian-baserte distribusjoner, installerer du `rename` slik:
sudo apt-get install rename
I Fedora og RedHat-baserte distribusjoner installerer du `prename` på denne måten:
sudo dnf install prename
For å installere det i Manjaro Linux bruker du følgende kommando. Her kalles kommandoen `perl-rename`:
sudo pacman -Syu perl-rename
La oss prøve igjen
Denne gangen bruker vi `rename`. Vi går tilbake i tid, slik at vi har et sett med «.prog»-filer.
ls *.prog
La oss bruke følgende kommando for å omdøpe filene. Deretter sjekker vi med `ls` om det fungerte. Husk å bytte ut `rename` med riktig kommandonavn for din Linux-distribusjon.
rename 's/.prog/.prg/' *.prog
ls *.pr*
Det fungerte. Nå er alle filene av typen «.prg», og det er ingen «.prog»-filer igjen i katalogen.
Hva skjedde denne gangen?
La oss forklare magien i tre deler.
Første del er kommandoen `rename` (eller `prename` eller `perl-rename`, avhengig av distribusjon).
Den siste delen er `*.prog`, som angir at `rename` skal operere på alle «.prog»-filer.
Den midterste delen definerer operasjonen som skal utføres på hvert filnavn. `s` betyr erstatning. Første begrep (`.prog`) er det `rename` skal søke etter i hvert filnavn, og det andre begrepet (`.prg`) er det det skal erstattes med.
Den midterste delen, uttrykket, er et Perl-regulært uttrykk, og det gir `rename`-kommandoen sin fleksibilitet.
Endre andre deler av filnavn
Nå har vi endret filtyper, men vi kan like gjerne endre andre deler av filnavn.
I katalogen vår er det mange C-kildekodefiler. Alle filnavnene starter med «slang_». Vi kan sjekke dette med `ls`.
ls sl*.c
Vi erstatter alle forekomster av «slang_» med «sl_». Formatet på kommandoen kjenner vi allerede. Vi endrer bare søkeordet, erstatningsordet og filtypen.
rename 's/slang_/sl_/' *.c
Vi søker nå etter «.c»-filer og deretter etter «slang_» i filnavnet. Når «slang_» finnes, erstattes det med «sl_».
Vi kan sjekke resultatet av kommandoen ved å gjenta `ls`-kommandoen med de samme parameterne:
ls sl*.c
Slette en del av et filnavn
Vi kan fjerne en del av et filnavn ved å erstatte søkeordet med ingenting.
ls *.c
rename 's/sl_//' *.c
ls *.c
Vi ser fra `ls`-kommandoen at «.c»-filene våre har «sl_» foran seg. La oss fjerne det helt.
`rename`-kommandoen følger samme format som før. Vi skal lete etter «.c»-filer. Søkeordet er «sl_», men det er ingen erstatning. To skråstreker uten noe mellom betyr ingenting, en tom streng.
`rename` vil behandle hver «.c»-fil. Den vil søke etter «sl_» i filnavnet. Hvis den finnes, erstattes den med ingenting. Med andre ord blir søkeordet slettet.
Den andre bruken av `ls`-kommandoen bekrefter at «sl_»-prefikset er fjernet fra alle «.c»-filene.
Begrens endringer til spesifikke deler av filnavn
La oss bruke `ls` for å se på filer som har strengen «param» i filnavnet. Deretter bruker vi `rename` for å erstatte den med «parameter». Vi bruker `ls` igjen for å se effekten `rename` har hatt.
ls *param*
rename 's/param/parameter/' *.c
ls *param*
Fire filer har «param» i filnavnet. `param.c`, `param_one.c` og `param_two.c` har «param» i starten av navnet. `third_param.c` har «param» på slutten, like før filtypen.
`rename`-kommandoen skal søke etter «param» i hele filnavnet, og erstatte det med «parameter» i alle tilfeller.
Den andre `ls`-kommandoen viser at det er akkurat det som har skjedd. Enten «param» var i starten eller slutten av filnavnet, har det blitt erstattet med «parameter».
Vi kan bruke Perls metategn for å avgrense søket. Metategn er symboler som representerer posisjoner eller sekvenser av tegn. For eksempel betyr `^` «starten av en streng», `$` betyr «slutten av en streng», og `.` betyr hvilket som helst tegn (unntatt linjeskift).
Vi bruker metategnet for starten av en streng (`^`) for å begrense søket til starten av filnavnene.
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c
Filene vi ga nytt navn tidligere er listet opp, og vi ser at strengen «parameter» er i starten av tre filnavn, og på slutten av ett filnavn.
`rename`-kommandoen vår bruker starten av linjen-metategnet (`^`) før søkeordet «parameter». Dette forteller `rename` å kun betrakte søkeordet som funnet hvis det er i starten av filnavnet. Søkestrengen «parameter» vil bli ignorert hvis den er et annet sted i filnavnet.
Ved å sjekke med `ls` kan vi se at filnavnet som hadde «parameter» på slutten ikke har blitt endret, men de tre filnavnene som hadde «parameter» i starten har fått søkestrengen erstattet med «verdi».
Kraften i `rename` ligger i kraften til Perl. Alle Perl sine muligheter er tilgjengelige for deg.
Søk med grupperinger
`rename` har enda flere triks. La oss se på tilfellet der du har filer med lignende strenger i filnavnene. De er ikke nøyaktig de samme strengene, så en enkelt søk-og-erstatt-operasjon fungerer ikke.
I dette eksemplet bruker vi `ls` for å se hvilke filer som starter med «str». Det er to av dem, `string.c` og `strangle.c`. Vi kan endre navnet på begge filene samtidig ved å bruke en teknikk som kalles gruppering.
Det sentrale uttrykket i denne `rename`-kommandoen vil søke etter strenger i filnavnene som har tegnsekvensen «stri» eller «stra», der disse sekvensene umiddelbart etterfølges av «ng». Med andre ord, søkeordet vårt skal se etter «streng» og «strang». Erstatningsordet er «bang».
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c
Å bruke `ls` en gang til bekrefter at `string.c` har blitt `bang.c` og `strangle.c` er nå `bangle.c`.
Bruke oversettelser med `rename`
Kommandoen `rename` kan utføre handlinger på filnavn som kalles oversettelser. Et enkelt eksempel på oversettelse er å konvertere alle filnavn til store bokstaver.
Merk at vi ikke bruker `s/` for å starte det sentrale uttrykket i `rename`-kommandoen nedenfor, vi bruker `y/`. Dette forteller `rename` at vi ikke utfører en erstatning, men en oversettelse.
`az`-uttrykket er et Perl-uttrykk som betyr alle små bokstaver fra a til z. Tilsvarende representerer `AZ`-uttrykket alle store bokstaver fra A til Z.
Det sentrale uttrykket i denne kommandoen kan omskrives som: «hvis noen av de små bokstavene fra a til z finnes i filnavnet, erstatt dem med tilsvarende tegn fra sekvensen av store bokstaver fra A til Z.»
For å tvinge filnavnene til alle «.prg»-filer til store bokstaver, bruk denne kommandoen:
rename «y/az/AZ/» *.prg
ls *.PRG
`ls`-kommandoen viser at alle «.prg»-filnavnene nå er med store bokstaver. Strengt tatt er de ikke lenger «.prg»-filer, men «.PRG»-filer. Linux skiller mellom store og små bokstaver.
Vi kan reversere den siste kommandoen ved å snu posisjonen til `az` og `AZ`-leddene i det sentrale uttrykket.
rename «y/AZ/az/» *.PRG
ls *.prg
Du trenger ikke å lære Perl på fem minutter
Det er absolutt nyttig å sette seg inn i Perl. Men for å bruke de tidsbesparende fordelene med `rename`-kommandoen trenger du ikke ha mye kunnskap om Perl for å oppnå store fordeler med tanke på kraft, enkelhet og tidsbesparelse.