Hur man använder byta namn på Command på Linux

Lär dig mer om filnamnet i Linuxvärlden och ge mvdig - och dig själv - vila. Renameär flexibel, snabb och ibland ännu enklare. Här är en handledning för detta kraftverk av ett kommando.

Vad är fel med mv?

Det är inget fel med mv. Kommandot gör 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.

Den mvKommandot 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 vad vi vill. Men mvär inte ett dedikerat verktyg för filnamn.

Byta namn på en enda fil med mv

Används för mvatt byta namn på en filtyp 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 för  lsatt kontrollera att filen har bytt namn.

mv oldfile.txt newfile.txt
ls * .txt

Byta namn på flera filer med mv

Saker blir svårare när du vill byta namn på flera filer. mvhar ingen möjlighet att hantera namn på flera filer. Du måste använda några smidiga Bash-tricks. Det är bra om du känner till något medelstort kommandorads-fu, men komplexiteten i att byta namn på flera filer med mvstår i skarp kontrast till hur lätt det är att använda för mvatt byta namn på en enda fil.

Saker eskalerar snabbt.

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

Hur kämpar vi för att mvgöra det för 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.

för f i * .prog; gör mv - "$ f" "$ {f% .prog} .prg"

Fungerade det? Låt oss kontrollera 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 långa kommandot egentligen? Låt oss bryta ner det.

för f i * .prog; gör 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 behandlingen kommer att göra . Den använder för  mvatt flytta varje fil till en ny fil. Den nya filen kommer att namnges med den ursprungliga filens namn exklusive ".prog" -delen. En ny förlängning av “.prg” används istället.

Det måste finnas ett enklare sätt

Absolut. Det är renamekommandot.

renameingår inte i en vanlig 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 ersätta lämpligt kommandonamn enligt den Linux-smak du använder.

i Ubuntu- och Debian-härledda distributioner installerar du renameså här:

sudo apt-get install byta namn

I distributioner från Fedora och RedHat installerar du prenameså här. Observera den initiala "p", som står för Perl.

sudo dnf installera förnamn

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

sudo pacman -Syu perl-byt namn

Låt oss göra det igen

Och den här gången använder vi rename. 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 kontrollerar sedan lsom det fungerade. Kom ihåg att byta ut renamemed rätt kommandonamn för din Linux om du inte använder Ubuntu eller en Debian-härledd Linux.

byta namn på 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 med denna tid?

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

Den första delen är kommandonamnet, rename(eller prenameeller perl-renameför de andra distributionerna).

Den sista delen är *.prog, som säger att man renameska använda alla ".prog" -filer.

Den mellersta delen definierar det arbete vi vill göra på varje filnamn. Den smedel substitut. Den första termen ( .prog) är vad som renameska sökas i varje filnamn och den andra termen ( .prg) är vad den kommer att ersättas med.

Den mellersta delen av kommandot, eller det centrala uttrycket, är ett Perl-"reguljärt uttryck" och det är det som ger renamekommandot 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 är prefixade med “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 känt för oss. Vi ändrar bara sökord, ersättningsterm och filtyp.

byta namn på s / slang_ / sl_ '*. c

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

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

ls sl * .c

Ta bort en del av ett filnamn

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

ls * .c
byta namn på s / sl _ // '* .c
ls * .c

Vi ser från lskommandot att våra ".c" -filer alla är förberedda med "sl_". Låt oss bli av med det helt.

Den renamekommandot följer samma format som tidigare. Vi ska leta efter ".c" -filer. Söktermen är “sl_”, men det finns inget substitutionsbegrepp. Två snedstreck utan något mellan dem betyder ingenting, en tom sträng.

renamekommer att behandla varje “.c” -fil i tur och ordning. Den söker efter “sl_” i filnamnet. Om den hittas kommer den att ersättas med ingenting. Med andra ord tas sökordet bort.

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

Begränsa ändringar av specifika delar av filnamn

Låt oss ls titta på filer som har strängen "param" i sitt filnamn. Då ska vi renameersätta den strängen med strängen "parameter". Vi använder en lsgång till för att se vilken effekt renamekommandot har haft på dessa filer.

ls * param *
byta namn på 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. third_param.c har "param" i slutet av sitt namn, strax före tillägget.

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

Den andra användningen av  lskommandot visar oss att det är exakt vad som har hänt. Oavsett om "param" var i början eller i slutet av filnamnet, har det ersatts med "parameter."

Vi kan använda Perls metatecken för att förfina beteendet hos mittuttrycket. Metatecken är symboler som representerar positioner eller sekvenser av tecken. Betyder till exempel ^”början av en sträng”, $betyder “slutet av en sträng” och .betyder vilken enskild karaktär som helst (bortsett från en nylinjetecken).

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

ls * param * .c
byta namn på s / ^ parameter / värde / '*. c
ls * param * .c
ls värde * .c

Filerna vi döptes om tidigare listas 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 renamekommando använder början på rad  (^) metakaraktär före söktermen "parameter". Detta talar om renameatt endast söka efter att söktermen har hittats om den är i början av filnamnet. Söksträngen "parameter" ignoreras om den finns någon annanstans i filnamnet.

Kolla med lskan 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 namnen har fått söksträngen ersatt med ersättningsordet "värde."

Kraften i renameligger i Perls kraft. All kraft från Perl står till ditt förfogande.

Söker med grupperingar

renamehar ännu fler knep i ä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 för ls 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 renamekommando söker 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årt sökord att leta efter "sträng" och "strang". Ersättningsuttrycket är "bang".

ls str * .c
byta namn på s / (stri | stra) ng / bang / '* .c
Jag förbjuder * .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

Det renamekommando 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 stora bokstäver.

I renamekommandot nedan märker vi att vi inte använder en för s/ att starta det centrala uttrycket, vi använder y/. Detta säger att  renamevi inte byter ut; vi utför en översättning.

Den a-z termen är ett Perl uttryck som betyder alla gemener i sekvensen från a till z. På samma sätt A-Z representerar termen alla stora bokstäver i sekvensen från A till Z.

Det centrala uttrycket i detta kommando kan omformuleras som "om någon av små bokstäver från a till z finns i filnamnet, ersätt dem med motsvarande tecken från sekvensen med stora bokstäver från A till Z."

För att tvinga filnamnen på alla ".prg" -filer till versaler, använd detta kommando:

byta namn på 'y / az / AZ /' * .prg

ls * .PRG

De lsvisar befaller oss att alla ”.prg” filnamn är nu i versaler. För att vara strikt noggranna är de faktiskt 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 a-zoch A-Z termerna i det centrala uttrycket.

byta namn på 'y / AZ / az /' * .PRG

ls * .prg

Du (Wo | Do) lär dig inte Perl på fem minuter

Att lära känna Perl är bra tid. Men för att börja använda de tidsbesparande funktionerna i renamekommandot behöver du inte ha mycket Perl-kunskap alls för att skörda stora fördelar i kraft, enkelhet och tid.