Hur man använder kommandot byt namn på Linux

Ta reda på det fildöpande kraftpaketet i Linux-världen och ge mv – och dig själv – en vila. Byt namn är flexibelt, snabbt och ibland till och med lättare. Här är en handledning till detta kraftpaket för ett kommando.

Vad är det för fel på mv?

Det är inget fel på mv. Kommandot gör det ett bra jobb, och det finns på alla Linux-distributioner, i macOS och i andra Unix-liknande operativsystem. Så det är alltid tillgängligt. Men ibland behöver du bara en bulldozer, inte en spade.

Kommandot mv har ett syfte i livet, och det är att flytta filer. Det är en glad bieffekt att den kan användas för att flytta en befintlig fil till en ny fil, med ett nytt namn. Nettoeffekten är att byta namn på filen, så att vi får det vi vill ha. Men mv är inte ett dedikerat verktyg för filbyte.

Byta namn på en enskild fil med mv

För att använda mv för att byta namn på en fil, skriv mv, ett mellanslag, namnet på filen, ett mellanslag och det nya namnet du vill att filen ska ha. Tryck sedan på Enter.

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

mv oldfile.txt newfile.txt
ls *.txt

Byta namn på flera filer med mv

Saker och ting blir svårare när du vill byta namn på flera filer. mv har ingen förmåga att hantera att byta namn på flera filer. Du måste använda några fiffiga Bash-trick. Det är bra om du känner till en medelgradig kommandoradsfu, men komplexiteten i att byta namn på flera filer med mv står i skarp kontrast till hur lätt det är att använda mv för att byta namn på en enda fil.

Saker och ting eskalerar snabbt.

Låt oss säga att vi har en katalog med en mängd olika filer i den, av olika typer. Vissa av dessa filer har filtillägget ”.prog”. Vi vill byta namn på dem på kommandoraden så att de har ett ”.prg”-tillägg.

Hur bråkar vi mv för att göra det åt oss? Låt oss ta en titt på filerna.

ls *.prog -l

Här är ett sätt att göra det som inte tillgriper att skriva en faktisk Bash-skriptfil.

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

för f i *.prog;  gör mv --

Fungerade det? Låt oss kolla filerna och se.

ls *.pr*

Så ja, det fungerade. De är alla ”.prg”-filer nu, och det finns inga ”.prog”-filer i katalogen.

Vad hände nyss?

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

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

Den första delen startar en loop som i sin tur kommer att behandla varje ”.prog”-fil i katalogen.

Nästa del säger vad bearbetningen kommer att göra. Den använder mv för att flytta varje fil till en ny fil. Den nya filen kommer att namnges med originalfilens namn exklusive ”.prog”-delen. En ny tillägg av ”.prg” kommer att användas istället.

Det måste finnas ett enklare sätt

Absolut. Det är kommandot byt namn.

Rename är inte en del av en standard Linux-distribution, så du måste installera den. Det har också ett annat namn i olika familjer av Linux, men de fungerar alla på samma sätt. Du måste bara byta ut det lämpliga kommandonamnet enligt Linux-smaken du använder.

i Ubuntu och Debian-härledda distributioner installerar du byta namn så här:

sudo apt-get install rename

I Fedora och RedHat-härledda distributioner installerar du förnamn så här. Notera det initiala ”p”, som står för Perl.

sudo dnf install prename

För att installera det i Manjaro Linux använd följande kommando. Observera att kommandot för att byta namn kallas perl-rename.

sudo pacman -Syu perl-rename

Låt oss göra det igen

Och den här gången kommer vi att använda byta namn. Vi rullar tillbaka klockan så att vi har en uppsättning ”.prog”-filer.

ls *.prog

Låt oss nu använda följande kommando för att byta namn på dem. Vi ska sedan kolla med ls om det fungerade. Kom ihåg att ersätta rename med lämpligt kommandonamn för din Linux om du inte använder Ubuntu eller en Debian-härledd Linux.

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

Det fungerade, de är nu alla ”.prg”-filer och det finns inga ”.prog”-filer kvar i katalogen.

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

Låt oss förklara den där biten av magi, i tre delar.

Den första delen är kommandot namn, rename (eller prename eller perl-rename , för de andra distributionerna).

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

Den mellersta delen definierar arbetet vi vill göra med varje filnamn. s betyder substitut. Den första termen (.prog) är vad den kommer att söka efter i varje filnamn och den andra termen (.prg) är vad den kommer att ersättas med.

Den mellersta delen av kommandot, eller centrala uttrycket, är en Perl ’vanligt uttryck’ och det är det som ger kommandot rename dess flexibilitet.

Ändra andra delar av ett filnamn

Vi har ändrat filnamnstillägg hittills, låt oss ändra andra delar av filnamnen.

I katalogen finns många C-källkodsfiler. Alla filnamn har prefixet ”slang_”. Vi kan kontrollera detta med ls.

ls sl*.c

Vi kommer att ersätta alla förekomster av ”slang_” med ”sl_”. Formatet på kommandot är redan bekant för oss. Vi ändrar bara söktermen, ersättningstermen och filtypen.

rename 's/slang_/sl_' *.c

Den här gången letar vi efter ”.c”-filer och söker efter ”slang_”. Närhelst ”slang_” hittas i ett filnamn ersätts det med ”sl_”.

Vi kan kontrollera resultatet av det kommandot genom att upprepa ls-kommandot ovanifrån med samma parametrar:

ls sl*.c

Ta bort del av ett filnamn

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

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

Vi kan se från ls-kommandot att alla våra ”.c”-filer är inlagda med ”sl_”. Låt oss bli av med det helt och hållet.

Kommandot Rename följer samma format som tidigare. Vi kommer att leta efter ”.c”-filer. Söktermen är ”sl_”, men det finns ingen ersättningsterm. Två omvända snedstreck utan något mellan dem betyder ingenting, en tom sträng.

Rename kommer att bearbeta varje ”.c”-fil i tur och ordning. Det kommer att söka efter ”sl_” i filnamnet. Om den hittas kommer den att ersättas av ingenting. Söktermen raderas med andra ord.

Den andra användningen av kommandot ls bekräftar att prefixet ”sl_” har tagits bort från varje ”.c”-fil.

Begränsa ändringar till specifika delar av filnamn

Låt oss använda ls för att titta på filer som har strängen ”param” i sitt filnamn. Sedan använder vi rename för att ersätta den strängen med strängen ”parameter”. Vi kommer att använda ls en gång till för att se vilken effekt kommandot rename har haft på dessa filer.

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

Fyra filer hittas som har ”param” i sitt filnamn. param.c, param_one.c och param_two.c har alla ”param” i början av sitt namn. tredje_param.c har ”param” i slutet av sitt namn, precis före tillägget.

Kommandot Rename kommer att söka efter ”param” överallt i filnamnet och ersätta det med ”parameter” i alla fall.

Den andra användningen av kommandot ls visar oss att det är precis vad som har hänt. Oavsett om ”param” var i början eller i slutet av filnamnet, har det ersatts av ”parameter.”

Vi kan använda Perls metakaraktärer för att förfina beteendet hos mittuttrycket. Metatecken är symboler som representerar positioner eller sekvenser av tecken. Till exempel betyder ^ ”början av en sträng”, $ betyder ”slutet på en sträng” och . betyder vilket enskilt tecken som helst (förutom ett nyradstecken).

Vi kommer att använda början av strängens metatecken ( ^ ) för att begränsa vår sökning till början av filnamnen.

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

Filerna vi döpte om tidigare är listade och vi kan se att strängen ”parameter” är i början av tre filnamn och den är i slutet av ett av filnamnen.

Vårt rename-kommando använder början av raden (^) metatecken före söktermen ”parameter”. Detta talar om för att ändra namn att endast betrakta söktermen som hittad om den är i början av filnamnet. Söksträngen ”parameter” kommer att 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 av filnamnet inte har ändrats, men de tre filnamnen som hade ”parameter” i början av sina namn har fått söksträngen ersatt av ersättaren termen ”värde”.

Kraften i att byta namn ligger i kraften i Perl. Alla kraften i Perl står till ditt förfogande.

Söka med grupperingar

byta namn har ännu fler trick i rockärmen. Låt oss överväga fallet där du kan ha filer med liknande strängar i deras namn. De är inte exakt samma strängar, så en enkel sökning och ersättning fungerar inte här.

I det här exemplet använder vi ls för att kontrollera vilka filer vi har som börjar med ”str”. Det finns två av dem, string.c och strangle.c. Vi kan byta namn på båda strängarna samtidigt med en teknik som kallas gruppering.

Det centrala uttrycket för detta byt namn kommer att söka efter strängar inom filnamn som har teckensekvensen ”stri” eller ”stra” där dessa sekvenser omedelbart följs av ”ng”. Med andra ord kommer vår sökterm att söka efter ”sträng” och ”strang”. Ersättningstermen är ”bang”.

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

Att använda ls en andra gång bekräftar att string.c har blivit bang.c och strangle.c är nu bangle.c.

Använda översättningar med byta namn

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

Lägg märke till att vi inte använder ett s/ för att starta det centrala uttrycket i kommandot rename nedan, vi använder y/. Detta talar om för att byta namn att vi inte utför en ersättning; vi utför en översättning.

az-termen är ett Perl-uttryck som betyder alla gemener i sekvensen från a till z. På samma sätt representerar AZ-termen alla versaler i sekvensen från A till Ö.

Det centrala uttrycket i det här kommandot kan omskrivas som ”om någon av de gemena bokstäverna från a till z finns i filnamnet, ersätt dem med motsvarande tecken från sekvensen av versaler från A till Ö.”

För att tvinga filnamnen för alla ”.prg”-filer till versaler, använd det här kommandot:

byt namn på ’y/az/AZ/’ *.prg

ls *.PRG

Kommandot ls visar oss att alla ”.prg”-filnamn nu är i versaler. I själva verket, för att vara strikt korrekt, är de inte längre ”.prg”-filer. De är ”.PRG”-filer. Linux är skiftlägeskänsligt.

Vi kan vända det sista kommandot genom att vända positionen för az- och AZ-termerna i det centrala uttrycket.

byt namn på ’y/AZ/az/’ *.PRG

ls *.prg

Du (Wo|Do)n’t Learn Perl på fem minuter

Att ta tag i Perl är väl använd tid. Men för att börja använda de tidsbesparande funktionerna i kommandot byt namn behöver du inte ha mycket Perl-kunskap alls för att skörda stora fördelar i kraft, enkelhet och tid.