
Krijg grip op de krachtpatser voor het hernoemen van bestanden van de Linux-wereld en geef mv– en jezelf – rust. Rename is flexibel, snel en soms zelfs gemakkelijker. Hier is een tutorial voor deze krachtpatser van een commando.
Wat is er mis met MV?
Er is niets mis mee mv . De opdracht doet het prima en is te vinden op alle Linux-distributies, in macOS en in andere Unix-achtige besturingssystemen. Het is dus altijd beschikbaar. Maar soms heb je gewoon een bulldozer nodig, geen schop.
De mv commando heeft een doel in het leven, en dat is om bestanden te verplaatsen. Het is een gelukkige bijwerking dat het kan worden gebruikt om een bestaand bestand te verplaatsen in een nieuw bestand, met een nieuwe naam. Het netto-effect is om het bestand een andere naam te geven, zodat we krijgen wat we willen. Maar mv is geen speciaal hulpprogramma voor het hernoemen van bestanden.
De naam van een enkel bestand wijzigen met mv
Gebruiken mv om een bestandstype te hernoemen mv, een spatie, de naam van het bestand, een spatie en de nieuwe naam die u het bestand wilt geven. Druk vervolgens op Enter.
Je kunt gebruiken ls om te controleren of het bestand is hernoemd.
mv oldfile.txt newfile.txt
ls *.txt

Meerdere bestanden hernoemen met mv
Het wordt lastiger als u meerdere bestanden wilt hernoemen. mv kan niet omgaan met het hernoemen van meerdere bestanden. Je moet een paar handige Bash-trucs gebruiken. Dat is prima als je een commandoregel van gemiddelde kwaliteit kent, maar de complexiteit van het hernoemen van meerdere bestanden met mv staat in schril contrast met het gebruiksgemak mv om een enkel bestand te hernoemen.
Dingen escaleren snel.
Laten we zeggen dat we een map hebben met een verscheidenheid aan bestanden erin, van verschillende typen. Sommige van deze bestanden hebben de extensie “.prog”. We willen ze hernoemen op de commandoregel zodat ze een “.prg” extensie hebben.
Hoe ruziën we mv om dat voor ons te doen? Laten we de bestanden eens bekijken.
ls *.prog -l

Hier is een manier om het te doen waarbij je geen echt Bash-scriptbestand schrijft.
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"

Doet dat werken? Laten we de bestanden bekijken en zien.
ls *.pr*

Dus ja, het werkte. Het zijn nu allemaal “.prg” -bestanden en er zijn geen “.prog” -bestanden in de directory.
Wat is er net gebeurd?
Wat deed dat lange commando eigenlijk? Laten we het opsplitsen.
for f in *.prog; do mv -- "$f" "${f%.prog}.prg"
Het eerste deel start een lus die elk “.prog” -bestand in de directory op zijn beurt gaat verwerken.
Het volgende deel zegt wat de verwerking zal zijn Doen. Het gebruikt mv om elk bestand naar een nieuw bestand te verplaatsen. Het nieuwe bestand krijgt de naam van het oorspronkelijke bestand, exclusief het “.prog” -gedeelte. In plaats daarvan wordt een nieuwe extensie “.prg” gebruikt.
Er moet een eenvoudigere manier zijn
Zeer zeker. Het is de rename opdracht.
rename maakt geen deel uit van een standaard Linux-distributie, dus u moet deze installeren. Het heeft ook een andere naam in verschillende Linux-families, maar ze werken allemaal op dezelfde manier. U hoeft alleen maar de juiste opdrachtnaam te vervangen volgens de Linux-smaak die u gebruikt.
in Ubuntu en van Debian afgeleide distributies die u installeert rename zoals dit:
sudo apt-get install rename

In Fedora en RedHat-afgeleide distributies die je installeert prename zoals dit. Let op de eerste ‘p’, die staat voor Perl.
sudo dnf install prename

Gebruik de volgende opdracht om het in Manjaro Linux te installeren. Merk op dat de opdracht voor het hernoemen wordt aangeroepen perl-rename.
sudo pacman -Syu perl-rename

Laten we dat nog een keer doen
En deze keer zullen we gebruiken rename. We draaien de klok terug zodat we een set “.prog” -bestanden hebben.
ls *.prog

Laten we nu de volgende opdracht gebruiken om ze te hernoemen. We zullen dan contact opnemen met ls of het werkte. Vergeet niet om te vervangen rename met de juiste opdrachtnaam voor uw Linux als u geen Ubuntu of een van Debian afgeleide Linux gebruikt.
rename 's/.prog/.prg/' *.prog
ls *.pr*

Dat werkte, het zijn nu allemaal “.prg” -bestanden en er zijn geen “.prog” -bestanden meer in de directory.
Wat is er op deze tijd gebeurd?
Laten we dat beetje magie in drie delen uitleggen.
De eerste deel is de naam van het commando, rename (of prename of perl-rename , voor de andere distributies).
De laatste een deel is *.prog, wat vertelt rename om te werken met alle “.prog” -bestanden.
De midden- part definieert het werk dat we willen doen aan elke bestandsnaam. De s betekent plaatsvervanger. De eerste term (.prog) is wat rename zal zoeken in elke bestandsnaam en de tweede term (.prg) is waarmee het zal worden vervangen.
Het middelste deel van het commando, of de centrale expressie, is een Perl ‘reguliere expressie’ en het is wat de rename command zijn flexibiliteit.
Andere delen van een bestandsnaam wijzigen
We hebben tot nu toe bestandsnaamextensies gewijzigd, laten we andere delen van de bestandsnamen aanpassen.
In de directory staan veel C-broncodebestanden. Alle bestandsnamen worden voorafgegaan door “slang_”. We kunnen dit controleren met ls.
ls sl*.c

We gaan alle gevallen van “slang_” vervangen door “sl_”. Het formaat van de opdracht is ons al bekend. We veranderen alleen de zoekterm, de vervangende term en het bestandstype.
rename 's/slang_/sl_' *.c

Dit keer zoeken we naar “.c” bestanden, en zoeken naar “slang_”. Elke keer dat “slang_” wordt gevonden in een bestandsnaam, wordt het vervangen door “sl_”.
We kunnen het resultaat van dat commando controleren door de ls commando van bovenaf met dezelfde parameters:
ls sl*.c

Een deel van een bestandsnaam verwijderen
We kunnen een deel van een bestandsnaam verwijderen door de zoekterm door niets te vervangen.
ls *.c
rename 's/sl_//' *.c
ls *.c

We kunnen zien aan de ls opdracht dat onze “.c” -bestanden allemaal worden voorafgegaan door “sl_”. Laten we daar helemaal vanaf komen.
De rename commando volgt hetzelfde formaat als hiervoor. We gaan op zoek naar “.c” -bestanden. De zoekterm is “sl_”, maar er is geen vervangende term. Twee backslashes zonder iets ertussen betekenen niets, een lege string.
rename verwerkt elk “.c” -bestand om beurten. Het zoekt naar “sl_” in de bestandsnaam. Als het wordt gevonden, wordt het door niets vervangen. Met andere woorden, de zoekterm wordt verwijderd.
Het tweede gebruik van de ls commando bevestigt dat het voorvoegsel “sl_” is verwijderd uit elk “.c” bestand.
Beperk wijzigingen tot specifieke delen van bestandsnamen
Laten we gebruiken ls om bestanden te bekijken die de tekenreeks “param” in hun bestandsnaam hebben. Dan gebruiken we rename om die string te vervangen door de string “parameter”. We zullen gebruiken ls nogmaals om het effect te zien van de rename commando heeft gehad op die bestanden.
ls *param*
rename 's/param/parameter' *.c
ls *param*

Er zijn vier bestanden gevonden met “param” in hun bestandsnaam. param.c, param_one.c, en param_two.c hebben allemaal “param” op de begin van hun naam. third_param.c heeft “param” op de einde van de naam, net voor de extensie.
De rename commando gaat overal in de bestandsnaam naar “param” zoeken en het in alle gevallen vervangen door “parameter”.
Het tweede gebruik van de ls commando laat ons zien dat dat precies is wat er is gebeurd. Of ‘param’ nu aan het begin of aan het einde van de bestandsnaam stond, het is vervangen door ‘parameter’.
We kunnen de metatekens van Perl gebruiken om het gedrag van de middelste uitdrukking te verfijnen. Metatekens zijn symbolen die posities of reeksen tekens vertegenwoordigen. Bijvoorbeeld, ^ betekent “begin van een string”, $ betekent “einde van een string”, en . betekent elk willekeurig teken (behalve een teken voor een nieuwe regel).
We gaan het begin van string metateken gebruiken ( ^ ) om onze zoekopdracht te beperken tot het begin van de bestandsnamen.
ls *param*.c
rename 's/^parameter/value/' *.c
ls *param*.c
ls value*.c

De bestanden die we eerder hebben hernoemd, worden weergegeven en we kunnen zien dat de tekenreeks “parameter” aan het begin van drie bestandsnamen staat en aan het einde van een van de bestandsnamen.
Onze rename commando gebruikt het begin van de regel (^) metateken vóór de zoekterm ‘parameter’. Dit vertelt rename om de zoekterm alleen als gevonden te beschouwen als deze aan het begin van de bestandsnaam staat. De zoekreeks “parameter” wordt genegeerd als deze ergens anders in de bestandsnaam staat.
Checken met ls, kunnen we zien dat de bestandsnaam met “parameter” op de einde van de bestandsnaam is niet gewijzigd, maar de drie bestandsnamen met “parameter” bij de begin van hun namen hebben de zoekreeks vervangen door de vervangende term ‘waarde’.
De kracht van rename ligt in de kracht van Perl. Alle kracht van Perl staat tot uw beschikking.
Zoeken met groeperingen
rename heeft nog meer trucs in petto. Laten we eens kijken naar het geval waarin u bestanden met vergelijkbare tekenreeksen in hun naam hebt. Het zijn niet precies dezelfde strings, dus een eenvoudige zoekopdracht en vervanging werken hier niet.
In dit voorbeeld gebruiken we ls om te controleren welke bestanden we hebben die beginnen met “str”. Er zijn er twee, string.c en wurgen.c. We kunnen beide strings tegelijk hernoemen met behulp van een techniek genaamd groepering.
De centrale uitdrukking hiervan rename commando zal zoeken naar tekenreeksen binnen bestandsnamen die de tekenreeks “stri” hebben of “Stra” waar die sequenties onmiddellijk worden gevolgd door “ng”. Met andere woorden, onze zoekterm zoekt naar ‘string’ en “Strang”. De vervangende term is “bang”.
ls str*.c
rename 's/(stri|stra)ng/bang/' *.c
ls ban*.c

Gebruik makend van ls een tweede keer bevestigt dat string.c bang is geworden. c en strangle.c is nu bangle.c.
Vertalingen gebruiken met nieuwe naam
De rename commando kan acties uitvoeren op bestandsnamen die vertalingen worden genoemd. Een eenvoudig voorbeeld van een vertaling is het forceren van een reeks bestandsnamen in hoofdletters.
In de rename commando hieronder merk op dat we geen s/ om de centrale uitdrukking te starten, gebruiken we y/. Dit vertelt rename we voeren geen vervanging uit; we voeren een vertaling uit.
De a-z term is een Perl-uitdrukking die alle kleine letters in de reeks van a tot z betekent. Evenzo is het A-Z term staat voor alle hoofdletters in de reeks van A tot Z.
De centrale uitdrukking in dit commando zou kunnen worden geparafraseerd als “als een van de kleine letters van a tot z wordt gevonden in de bestandsnaam, vervang deze dan door de overeenkomstige tekens uit de reeks hoofdletters van A tot Z.”
Gebruik deze opdracht om de bestandsnamen van alle “.prg” -bestanden in hoofdletters te forceren:
hernoem ‘y / az / AZ /’ * .prg
ls *.PRG

De ls commando laat ons zien dat alle “.prg” bestandsnamen nu in hoofdletters staan. Om precies te zijn, het zijn eigenlijk geen “.prg” -bestanden meer. Het zijn “.PRG” -bestanden. Linux is hoofdlettergevoelig.
We kunnen dat laatste commando omkeren door de positie van de a-z en A-Z termen in de centrale uitdrukking.
hernoem ‘y / AZ / az /’ * .PRG
ls *.prg

Jij (Wo | Do) leert Perl niet in vijf minuten
Het leren kennen van Perl is een goed bestede tijd. Maar om de tijdbesparende mogelijkheden van het rename commando, hoeft u helemaal niet veel Perl-kennis te hebben om grote voordelen te behalen in kracht, eenvoud en tijd.