Hur man använder kommandot byt namn på Linux

By rik

Utforska den effektiva metoden för filnamnsändring i Linux och ge kommandot `mv` – och dig själv – en paus. Verktyget `rename` är flexibelt, snabbt och ofta mer användarvänligt. Här får du en introduktion till detta kraftfulla kommandoverktyg.

Vad är problemet med `mv`?

Det finns inget fel med kommandot `mv`. Det gör sitt jobb utmärkt och är tillgängligt på alla Linux-distributioner, macOS och andra Unix-liknande system. Det är alltid praktiskt. Ibland behöver man dock mer än en spade – en bulldozer.

Kommandot `mv` är primärt utformat för att flytta filer. Att det också kan byta namn på filer är en bieffekt. Men `mv` är inte optimerat för filnamnsändring.

Byta namn på en enskild fil med `mv`

För att byta namn på en fil med `mv`, skriv `mv`, följt av ett mellanslag, det gamla filnamnet, ett mellanslag och det nya filnamnet. Tryck sedan på Enter.

Du kan använda `ls` för att kontrollera att filen har bytt namn.

mv gammalfil.txt nyfil.txt
ls *.txt

Byta namn på flera filer med `mv`

Det blir mer komplicerat när du vill ändra namnet på flera filer. Kommandot `mv` saknar inbyggd funktion för att hantera flera filer samtidigt. Du behöver använda avancerade Bash-tekniker. Det är bra om du har erfarenhet av terminalen, men jämfört med hur lätt det är att byta namn på en fil, blir processen med `mv` för flera filer snabbt omständlig.

Låt oss säga att du har en katalog med olika filtyper, varav några har filändelsen ”.prog”. Målet är att byta namn på dem till ”.prg” direkt i terminalen.

Hur får vi `mv` att göra detta? Vi börjar med att granska filerna.

ls *.prog -l

Här är ett sätt att göra det utan att skriva ett helt Bash-skript.

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done

Fungerade det? Låt oss kontrollera filerna igen.

ls *.pr*

Ja, det fungerade. Alla filer har nu filändelsen ”.prg”, och det finns inga ”.prog”-filer kvar.

Vad hände i det tidigare kommandot?

Vad gjorde det långa kommandot egentligen? Låt oss bryta ner det.

for f in *.prog; do mv -- "$f" "${f%.prog}.prg"; done

Den första delen startar en loop som går igenom varje fil med ändelsen ”.prog” i katalogen.

Nästa del specificerar vad som ska utföras. Det använder `mv` för att flytta varje fil till ett nytt namn. Det nya filnamnet skapas genom att ta det gamla namnet, ta bort ”.prog” och ersätta det med ”.prg”.

Finns det en enklare metod?

Absolut. Använd kommandot `rename`.

Kommandot `rename` ingår inte som standard i alla Linux-distributioner, så du kan behöva installera det. Beroende på vilken Linux-variant du använder kan det ha olika namn, men de fungerar i grunden likadant. Du behöver bara justera kommandot efter din distribution.

I Ubuntu och Debian-baserade system installerar du `rename` så här:

sudo apt-get install rename

I Fedora och RedHat-baserade system installerar du `prename`. Notera det inledande ”p”, som står för Perl.

sudo dnf install prename

För att installera det i Manjaro Linux, använd detta kommando. Kommandot för att byta namn kallas `perl-rename`.

sudo pacman -Syu perl-rename

Låt oss testa igen

Den här gången använder vi `rename`. Vi återställer filerna så att vi har en uppsättning ”.prog”-filer.

ls *.prog

Nu använder vi följande kommando för att byta namn på filerna. Vi kontrollerar sedan med `ls` för att se om det fungerade. Kom ihåg att byta ut `rename` med rätt kommando för din Linux-variant om du inte använder Ubuntu eller en Debian-baserad distribution.

rename 's/\.prog/\.prg/' *.prog
ls *.pr*

Det fungerade! Alla filerna är nu ”.prg”-filer, och det finns inga ”.prog”-filer kvar i katalogen.

Vad hände den här gången?

Låt oss förklara magin i tre delar.

Den första delen är kommandot `rename` (eller `prename` eller `perl-rename` beroende på distributionen).

Den sista delen är `*.prog`, som anger att `rename` ska fungera på alla ”.prog”-filer.

Mellandelen specificerar vad vi vill göra med varje filnamn. `s` står för substitution. Den första termen (`.prog`) är det vi letar efter i varje filnamn, och den andra termen (`.prg`) är vad vi ersätter det med.

Denna mellandel av kommandot, den centrala delen, är ett Perl reguljärt uttryck, vilket är det som ger kommandot `rename` dess flexibilitet.

Ändra andra delar av filnamn

Hittills har vi ändrat filändelser, men låt oss ändra andra delar av filnamnen.

I katalogen finns flera C-källkodsfiler. Alla filnamn börjar med ”slang_”. Vi kan kontrollera detta med `ls`.

ls sl*.c

Vi ska ersätta alla förekomster av ”slang_” med ”sl_”. Kommandots format är redan bekant. Vi ändrar bara söktermen, ersättningstermen och filtypen.

rename 's/slang_/sl_/' *.c

Denna gång letar vi efter ”.c”-filer och söker efter ”slang_”. Varje gång ”slang_” hittas i ett filnamn, ersätts det med ”sl_”.

Vi kan kontrollera resultatet genom att upprepa `ls` med samma parametrar:

ls sl*.c

Ta bort en del av ett filnamn

Vi kan ta bort delar av ett filnamn genom att ersätta söktermen med ingenting.

ls *.c
rename 's/sl_//' *.c
ls *.c

Från `ls`-kommandot ser vi att alla våra ”.c”-filer innehåller ”sl_” i sina namn. Låt oss ta bort det helt.

Kommandot `rename` följer samma format som tidigare. Vi letar efter ”.c”-filer. Söktermen är ”sl_”, men det finns ingen ersättningsterm. Två snedstreck utan något emellan representerar en tom sträng.

`Rename` behandlar varje ”.c”-fil i tur och ordning. Den söker efter ”sl_” i filnamnet. Om den hittas kommer den att ersättas med ingenting, alltså raderas.

Den andra körningen av `ls` bekräftar att prefixet ”sl_” har tagits bort från alla ”.c”-filer.

Begränsa ändringar till specifika delar av filnamn

Låt oss använda `ls` för att titta på filer med strängen ”param” i filnamnet. Sedan använder vi `rename` för att ersätta den med ”parameter”. Vi använder `ls` igen för att se resultatet.

ls *param*
rename 's/param/parameter/' *.c
ls *param*

Fyra filer hittas som innehåller ”param” i sina namn. `param.c`, `param_one.c` och `param_two.c` har ”param” i början av namnet. `tredje_param.c` har ”param” i slutet, precis före filändelsen.

Kommandot `Rename` letar efter ”param” var som helst i filnamnet och ersätter det med ”parameter”.

Den andra körningen av `ls` visar att det är precis vad som hände. Oavsett om ”param” var i början eller i slutet, ersattes det med ”parameter.”

Vi kan använda Perls metatecken för att finjustera hur sökningen fungerar. Metatecken är symboler som representerar positioner eller sekvenser av tecken. Till exempel betyder `^` ”början av strängen”, `$` betyder ”slutet av strängen” och `.` betyder vilket enskilt tecken som helst (utom radbrytning).

Vi använder metatecknet för strängens början (`^`) för att begränsa sökningen till början av filnamnen.

ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

Filerna vi bytte namn på tidigare listas och vi ser att strängen ”parameter” finns i början av tre filnamn, och i slutet av en av dem.

Vårt `rename`-kommando använder start-of-line metatecknet `^` före söktermen ”parameter”. Detta instruerar `rename` att endast leta efter söktermen i början av filnamnet. Söktermen ”parameter” ignoreras om den finns någon annanstans i filnamnet.

När vi kollar med `ls` kan vi se att filnamnet som hade ”parameter” i slutet inte har ändrats, medan de tre filnamnen som hade ”parameter” i början av namnet har fått söktermen ersatt med ”value”.

Styrkan i `rename` kommer från kraften i Perl. All kraften i Perl är tillgänglig för dig.

Sök med grupperingar

`rename` har ännu fler knep i ärmen. Tänk dig situationen när du har filer med liknande strängar i namnen, men inte exakt samma strängar, så en enkel sökning och ersättning inte fungerar.

I det här exemplet använder vi `ls` för att undersöka filer som börjar med ”str”. Det finns två: `string.c` och `strangle.c`. Vi kan byta namn på dem samtidigt genom en teknik som kallas gruppering.

Det centrala uttrycket för `rename` kommer att söka efter strängar i filnamn som har sekvensen ”stri” eller ”stra” som omedelbart följs av ”ng”. Alltså, vår sökterm letar efter ”string” och ”strang”. Ersättningstermen är ”bang”.

ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

En andra användning av `ls` bekräftar att `string.c` har blivit `bang.c` och `strangle.c` är nu `bangle.c`.

Använda översättningar med `rename`

Kommandot `rename` kan utföra åtgärder på filnamn som kallas översättningar. Ett enkelt exempel är att tvinga en uppsättning filnamn till versaler.

Notera att vi inte använder `s/` i början av kommandot. Istället använder vi `y/`. Detta talar om för `rename` att vi utför en översättning, inte en substitution.

`az`-termen är ett Perl-uttryck som betyder alla gemener från a till z. `AZ`-termen representerar alla versaler från A till Z.

Det centrala uttrycket i kommandot kan formuleras som ”om en av gemenerna från a till z finns i filnamnet, ersätt den med motsvarande versal från sekvensen A till Z.”

För att tvinga alla filnamn med ändelsen ”.prg” till versaler, använd detta kommando:

rename 'y/a-z/A-Z/' *.prg
ls *.PRG

Kommandot `ls` visar att alla ”.prg”-filer nu är i versaler. Strikt talat är de inte längre ”.prg”-filer. De är ”.PRG”-filer. Linux skiljer på gemener och versaler.

Vi kan vända det föregående kommandot genom att byta plats på `az`- och `AZ`-termerna i det centrala uttrycket.

rename 'y/A-Z/a-z/' *.PRG
ls *.prg

Du lär dig inte Perl på fem minuter

Att lära sig Perl är en värdefull investering. Men för att utnyttja de tidsbesparande funktionerna i `rename`, behöver du inte vara någon Perl-expert. Du kan dra stor nytta av dess kraft och enkelhet.