
Lär dig mer om filnamnet i Linuxvärlden och ge mv
dig - 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 mv
Kommandot 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 mv
att 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 ls
att 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. mv
har 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 mv
står i skarp kontrast till hur lätt det är att använda för mv
att 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 mv
gö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 mv
att 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 rename
kommandot.
rename
ingå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 rename
så här:
sudo apt-get install byta namn
I distributioner från Fedora och RedHat installerar du prename
så 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 ls
om det fungerade. Kom ihåg att byta ut rename
med 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 prename
eller perl-rename
för de andra distributionerna).
Den sista delen är *.prog
, som säger att man rename
ska använda alla ".prog" -filer.
Den mellersta delen definierar det arbete vi vill göra på varje filnamn. Den s
medel substitut. Den första termen ( .prog
) är vad som rename
ska 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 rename
kommandot 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 ls
kommandot 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 ls
kommandot att våra ".c" -filer alla är förberedda med "sl_". Låt oss bli av med det helt.
Den rename
kommandot 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.
rename
kommer 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 ls
kommandot 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 rename
ersätta den strängen med strängen "parameter". Vi använder en ls
gång till för att se vilken effekt rename
kommandot 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 rename
kommando kommer att söka efter ”param” överallt i filnamnet, och ersätta det med ”parameter” i alla fall.
Den andra användningen av ls
kommandot 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 rename
kommando använder början på rad (^
) metakaraktär före söktermen "parameter". Detta talar om rename
att 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 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 namnen har fått söksträngen ersatt med ersättningsordet "värde."
Kraften i rename
ligger i Perls kraft. All kraft från Perl står till ditt förfogande.
Söker med grupperingar
rename
har ä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 rename
kommando 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 rename
kommando 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 rename
kommandot 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 rename
vi 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 ls
visar 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-z
och 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 rename
kommandot behöver du inte ha mycket Perl-kunskap alls för att skörda stora fördelar i kraft, enkelhet och tid.