Organiser Linux-filene dine på en enkel måte med disse 5 metoden for batch-renaming

Lær effektive metoder for batch-omdøping av filer i Linux, fra enkle for-løkker til kraftige verktøy som sed, rename, zmv og mmv.
En av de vanligste oppgavene for de som er nye til Linux, er batch-omdøping av filer. Hvis du ikke er vant med en Linux-shell, kan dette virke som en oppgave som må gjøres manuelt og vil ta tid. Men det finnes mange måter å effektivisere prosessen på; du må bare vite hvilken metode som er best.
Eksempler på filflyttingsoppgaver
For å demonstrere hver tilnærming, vil jeg bruke to eksempler som representerer vanlige omdøpingsoppgaver du kanskje ønsker å utføre. Det finnes mange ulike måter du kan ønske å omdøpe filer på, avhengig av deres nåværende navn og hva du faktisk gjør. De to eksempeloppgavene jeg vil bruke, kan hjelpe til med å illustrere typisk bruk av hvert verktøy. Du må imidlertid undersøke verktøyet du velger videre for å forstå hvordan du best bruker det til dine spesifikke behov.
Å finne ut hva du faktisk ønsker å gjøre, er sannsynligvis den vanskeligste delen av batch-omdøping av filer. Tenk over hvilke deler av hvert filnavn du kanskje ønsker å slette, hvilke du ønsker å beholde, og hvilke du ønsker å oversette til noe annet.
Den første oppgaven er å endre filtypen på alle matchende filer i den nåværende katalogen. For eksempel, å endre en “.txt”-filtype til “.md” bør omdøpe test-001.txt til test-001.md, og omdøpe ANOTHER.txt til ANOTHER.md. Dette bør gjelde filer som slutter med “.txt” og ingen andre.
Den andre oppgaven er litt mer komplisert, for å vise noen mer avanserte funksjoner ved disse verktøyene. Den bør fjerne en spesifikk del av et filnavn, mens alt annet forblir intakt. Den skal gjelde alle filer, rekursivt. Spesifikt skal jeg lete etter alle filer av formen DDDD_noe.ext og omdøpe dem til DDDD.ext. Så den skal endre 1234_this-is-my-doc.doc til 1234.doc og docs/9999_about.txt til docs/9999.txt.
1. Med en for-løkke, globbing og parameter-substitusjon
Denne første tilnærmingen bruker flere funksjoner fra bash-shellen, som mange andre shell har lånt. Først ut er den beskjedne for-løkken, som vil brukes til å iterere over et sett med kandidatfiler. For det andre identifiserer den disse filene ved hjelp av en glob, en type mønster som er optimalisert for filnavnmatching. Til slutt bruker denne tilnærmingen en syntaks som lar deg modifisere strenger basert på visse mønstre, kalt parameter-substitusjon.
For den første oppgaven kan du endre .txt-filtype til .md ved å bruke denne shell-koden:
for file in ./*.txt;
do
mv -- "$file" "${file%.txt}.md";
doneFor-løkken itererer gjennom alle filer som matcher globen ./*.txt. Dette vil matche alle filer i den nåværende katalogen som slutter med “.txt”-filtypen.
Kommanden inne i for-løkken flytter filen til et nytt navn, som den genererer med % operatoren. Dette symbolet fjerner den korteste delen av et mønster som matcher slutten av strengen. I dette tilfellet fjerner den “.txt” fra slutten av hvert filnavn, og legger deretter til “.md” på slutten.
Alle eksemplene i denne artikkelen er illustrative og bør ikke brukes naivt i et produksjonsmiljø. For en robust løsning bør du vurdere om filene dine kan inneholde spesialtegn—spesielt mellomrom—og du bør alltid ha en backup-policy for å beskytte mot feil.
Den andre oppgaven begynner med et mye mer komplisert globmønster for å håndtere både rekursjon og et bredere sett av filer:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_?*.*;
do
mv -- "$file" "${file//_*./.}";
doneDen ./**/ utvides for å matche den nåværende katalogen og eventuelle innebygde kataloger, på ethvert nivå under denne. Mønsteret [[:digit:]] matcher et enkelt sifre, så fire på rad, etterfulgt av et understrek, vil matche våre ønskede filer.
Sørg for at du forstår hvilken shell du bruker for å kjøre denne kommandoen, og hvilke globbing-funksjoner den støtter.
For å aktivere rekursiv globbing i Bash 4+, må du sørge for å kjøre shopt -s globstar, enten som en engangskommando eller innenfor skriptet ditt. På Mac støtter zsh-shellen rekursiv globbing som standard.
2. Med en for-løkke og sed
Et annet alternativ for kommandoen inne i for-løkken din er sed, stream-editoren. Sed-programmet bør være tilgjengelig på enhver Linux, inkludert macOS.
for file in ./*.txt;
do
mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";
doneForskjellen i denne versjonen er at parameteren...
substitusjon blir erstattet med kommando-substitusjon og et kall til sed. Den $(...) syntaksen får kommandoen til å kjøre, og dens utdata blir substituert på dette punktet.
Regulærekspresjonen som sendes til sed, erstatter "txt"-verdien på slutten av hvert filnavn med "md". Dollar-tegnet i mønsteret sikrer at matchet skjer på slutten av et filnavn.
I den andre oppgaven blir regulærekspresjonen enda mer kompleks, selv om den grunnleggende tilnærmingen forblir den samme:
for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_*.*;
do
mv -- "$file" "$(echo "$file" | sed -E -e 's/([[:digit:]]{4})_.+(\..+)/\1\2/')";
doneVær oppmerksom på at seds regulærekspresjonssyntaks støtter repetisjonsoperatorer som {4}, som lar deg unngå den mer utfyllende tilnærmingen i glob-mønsteret.
Selv om disse sed-løsningene er litt lengre enn parameter-substitusjonsalternativene, kan de være mer lesbare, spesielt for de med forståelse av regulærekspresjoner og sed. Dens støtte for regulærekspresjoner, sammen med ulike andre funksjoner, betyr at sed er et langt mer kraftig alternativ. For komplekse krav kan dette gjøre det til et foretrukket valg.
3 Bruk av rename-kommandoen
rename-kommandoen er et Perl-skript med støtte for å kjøre vilkårlig Perl-kode, optimalisert for å håndtere filnavnendringer. Dette betyr at den er svært kraftig, selv om du må installere den på et system med Perl tilgjengelig.
Når den er installert, er rename veldig enkel å bruke for enkle oppgaver, som for eksempel å endre filendelser i vårt første eksempel:
rename 's/\txt$/md/' ./*.txtLegg merke til hvordan regulærekspresjonen er identisk med den i det tilsvarende sed-eksemplet. Her ligger imidlertid fordelen i renames håndtering av filnavn. Programmet vil bruke substitusjonen på hvert filnavnargument, så ved å bruke en glob som utvider seg til alle .txt-filer, kan du fullføre oppgaven med en en-liner.
rename-kommandoen støtter en -n/--dry-run opsjon, som skriver ut en logg over potensielle endringer, uten å faktisk endre filene. Dette er et utmerket sikkerhetsnett som jeg anbefaler å bruke når det er mulig.
Andre oppgave med rename
Du trenger også bare en en-linjekommando for den andre oppgaven, selv om regulærekspresjonen er litt mer komplisert.
rename 's/(\/\d{4})_.*(\..*)/$1$2/' ./**/*Merk igjen at dette utnytter den utvidede glob-støtten for rekursive kataloger.
4 Bruk av zmv med zsh
Hvis du bruker zsh, Z-skal, er det et annet alternativ tilgjengelig, forutsatt at du aktiverer det først. zmv er en skallfunksjon som fungerer som en forenklet versjon av rename. Du må laste det—enten på en sak for sak basis, eller via et oppstartsskript som .zshrc—ved å bruke denne kommandoen:
autoload zmvNår det er aktivert, kan du kalle zmv slik, for å utføre den første oppgaven:
zmv -W '*.txt' '*.md'I motsetning til rename, tar zmv oss tilbake til globbing i stedet for regulærekspresjoner, så det er litt mindre kraftig. Men, som du kan se fra dette eksemplet, er det enkelt å bruke; -W opsjonen forenkler syntaksen ytterligere fra standard.
Siden det er en skallfunksjon, har ikke zmv en innebygd man-siden. Men du kan finne ut noe informasjon om det via man zshcontrib i stedet. Spesielt legg merke til at det også støtter en -n opsjon for å utføre en tørr kjøring.
Fordeler med zmv
Ettersom zmv krever zsh, drar det fordel av den utvidede globbing som skallet gir, inkludert rekursjon inn i underkataloger.
zmv '(**/)([0-9][0-9][0-9][0-9])_*(.*)' '$1$2$3'Uten støtte for regulærekspresjoner er dette mønsteret litt lengre, men fortsatt veldig lesbart.
5 Bruk av mmv
mmv står for "multiple move" og det er et annet verktøy spesifikt designet for å håndtere massenavnendringer. Du må trolig installere det, men dette er bare et enkelt tilfelle av sudo apt install mmv (Ubuntu), sudo yum install mmv (RHEL/CentOS/Fedora), brew install mmv (Mac), eller det tilsvarende i din pakke-håndterer av valg.
Når det er installert, kan du bruke verktøyet til å endre endelser enkelt:
mmv '*.txt'.#1.md
Den store forskjellen med mmv er hvordan det håndterer mønstre og samsvar. I tillegg til de mest kjente jokere, støtter mmv også en ; joker som du kan bruke for å matche et vilkårlig antall kataloger, noe som støtter den rekursive naturen til den andre oppgaven:
mmv -n ';[0-9][0-9][0-9][0-9]_*.*' '#1#2#3#4#5.#7'Merk også hvordan mmv støtter referanser til samsvar, ikke via de typiske parentesene, men ved å tildele et unikt nummer til hver enkelt joker. Dette gir oss syv forskjellige samsvar i det endelige erstatningsuttrykket: ett for den ledende stien matchet av ;, ett for hver av de fire sifrene, ett—#6—for de eventuelle tegnene etter understreken, som vi kasserer, og ett for filtypen som følger etter punktumet.
På grunn av denne tilnærmingen kan mmv være for tungrodd for oppgaver som involverer for mange jokere i det opprinnelige mønsteret. Men når man utfører oppgaver som den vanlige filtypen-ombyttingen, er det vanskelig å slå det på enkelhet og lesbarhet.
Selv om det finnes mange alternativer for massefilnavngivning i Linux, krever hver enkelt litt tilvenning. Jeg anbefaler å velge en som ser mest tilgjengelig ut, og bli kjent med den så godt du kan, med rikelig bruk av -n/--dry-run alternativet for de verktøyene som støtter det.
Hvis du er en fan av regulære uttrykk, er det vanskelig å overgå deres enorme kraft, og et verktøy som rename vil sannsynligvis tjene deg godt. Hvis, derimot, du er mer av en skallguru, en trollmann med jokere, vil du sannsynligvis like utseendet til zmv eller mmv. Men disse verktøyene er kun nyttige hvis du bruker Z-skallet, eller hvis du installerer dem og lærer deg deres egenartede syntaks, henholdsvis.
I mellomtiden kan parameterutskifting være overraskende kraftfull, og du vil kanskje gjenta din massefilnavngivning, så det å skrive et skallskrift har ytterligere fordeler. Til slutt er valget ditt, og hvilket som helst av disse alternativene er å foretrekke fremfor å omdøpe hundrevis av filer manuelt ved hjelp av et GUI. Det er kraften til kommandolinjen.
Hvis du vil lese flere artikler som Organiser Linux-filene dine på en enkel måte med disse 5 metoden for batch-renaming, kan du besøke kategorien Linux.

Legg igjen en kommentar