Organiser dine Linux-filer på den nemme måde med disse 5 batch-omdøbingsmetoder

Indeks
  1. Eksempel Fil Flyt Opgaver
  • 1 Med en for Løkke, Globbing og Parameter Substitution
  • 2 Med en for Løkke og sed
  • 3 Brug af rename-kommandoen
  • 4 Brug zmv med zsh
  • 5 Brug af mmv
  • Den store forskel med mmv
  • Muligheder for masseomdøbning
  • Omdøbninger af filer i Linux kan være komplekse, men der findes effektive metoder som bash-scripts, sed, rename, zmv og mmv til at forenkle processen.

    En af de mest almindelige opgaver for dem, der er nye i Linux, er batchfil-omdøbning. Hvis du ikke er vant til en Linux-shell, kan dette virke som en opgave, der helt sikkert vil være manuel og tidskrævende. Men der er mange måder at fremskynde processen på; du skal bare vide, hvilken der er bedst.

    Eksempel Fil Flyt Opgaver

    For at demonstrere hver tilgang vil jeg bruge to eksempler, der repræsenterer almindelige omdøbningsopgaver, du måske ønsker at udføre. Der er mange forskellige måder, du kan ville omdøbe filer, afhængigt af deres nuværende navne og hvad du faktisk laver. De to eksempelopgaver, jeg vil bruge, kan hjælpe med at illustrere typisk brug af hvert værktøj. Du skal dog undersøge det værktøj, du vælger, nærmere for at forstå, hvordan det bedst kan bruges til dine specifikke behov.

    At finde ud af, hvad du faktisk vil gøre, er sandsynligvis den sværeste del af batchfil-omdøbning. Overvej hvilke dele af hver fils navn, du måske vil slette, hvilke du måske vil beholde, og hvilke du måske vil oversætte til noget andet.

    Den første opgave er at ændre filendelsen for alle matchende filer i den nuværende mappe. For eksempel skulle det at ændre en “.txt”-endelse til “.md” omdøbe test-001.txt til test-001.md, og omdøbe ANOTHER.txt til ANOTHER.md. Det skulle gælde for filer, der ender med “.txt” og ingen andre.

    Den anden opgave er lidt mere kompliceret for at vise nogle mere avancerede funktioner af disse værktøjer. Den skulle fjerne en specifik del af et filnavn, mens alt andet forbliver intakt. Den skulle gælde for alle filer, rekursivt. Jeg vil specifikt lede efter alle filer af formen DDDD_something.ext og omdøbe dem til DDDD.ext. Så den skulle ændre 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 Substitution

    Denne første tilgang bruger flere funktioner fra bash-shellen, som mange andre shells har lånt. Først er den ydmyge for-løkke, som den vil bruge til at iterere over et sæt af kandidatfiler. For det andet identificerer den disse filer ved hjælp af et glob, en form for mønster, der er optimeret til filnavnematchning. Endelig bruger denne tilgang en syntaks, der lader dig ændre strenge baseret på bestemte mønstre, kaldet parameter substitution.

    Til den første opgave kan du ændre .txt-ender til .md ved at bruge denne shell-kode:

    for file in ./*.txt;
    do
     mv -- "$file" "${file%.txt}.md";
    done

    For-løkken itererer gennem alle filer, der matcher glob ./*.txt. Dette vil matche alle filer i den aktuelle mappe, der ender i “.txt”-endelse.

    Kommanden inde i for-løkken flytter filen til et nyt navn, som den genererer med % operatoren. Dette symbol fjerner den korteste del af et mønster, der matcher slutningen af strengen. I dette tilfælde fjerner det “.txt” fra slutningen af hvert filnavn og tilføjer derefter “.md” til slutningen.

    Alle eksempler i denne artikel er illustrative og bør ikke bruges naivt i et produktionsmiljø. For en robust løsning bør du overveje, om dine filer kan indeholde specialtegn—især mellemrum—og du bør altid have en backuppolitik for at beskytte mod fejl.

    Den anden opgave starter med et meget mere kompliceret globmønster for at håndtere både rekursion og et bredere sæt af filer:

    for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_?*.*;
    do
     mv -- "$file" "${file//_*./.}";
    done

    Det ./**/ ekspanderer for at matche den nuværende mappe og eventuelle indlejrede mapper, på hvilket som helst niveau under dette. Mønsteret [[:digit:]] matcher et enkelt ciffer, så fire på stribe efterfulgt af et understreg vil matche vores ønskede filer.

    Sørg for at forstå, hvilken shell du bruger til at køre denne kommando, og hvilke globbing funktioner den understøtter.

    For at aktivere rekursiv globbing i Bash 4+, skal du sørge for at køre shopt -s globstar, enten som en engangs kommando eller inden i dit script. På Mac understøtter zsh-shellet rekursiv globbing som standard.

    2 Med en for Løkke og sed

    En anden mulighed for kommandoen inde i din for-løkke er sed, stream editoren. Sed-programmet bør være tilgængeligt på enhver Linux, inklusive macOS.

    for file in ./*.txt;
    do
     mv -- "$file" "$(echo "$file" | sed -e 's/txt$/md/')";
    done

    Forskellen i denne version er, at parameteren...

    substitution er blevet erstattet med kommando-erstatning og et kald til sed. Den $(...) syntaks får kommandoen til at køre, og dens output bliver erstattet på dette punkt.

    Den regulære udtryk, der sendes til sed, erstatter "txt" værdien i slutningen af hver filnavn med "md". Tegnet $ i mønsteret sikrer, at matchen finder sted i slutningen af et filnavn.

    I den anden opgave bliver den regulære udtryk endnu mere kompleks, selvom den grundlæggende tilgang forbliver den samme:

    for file in ./**/[[:digit:]][[:digit:]][[:digit:]][[:digit:]]_*.*;
    do
     mv -- "$file" "$(echo "$file" | sed -E -e 's/([[:digit:]]{4})_.+(\..+)/\1\2/')";
    done

    Bemærk, at sed’s regulære udtryk syntaks understøtter repetitionsoperatører som {4}, hvilket lader dig undgå den mere verbose tilgang i glob mønsteret.

    Selvom disse sed-løsninger er lidt længere end deres parameter-erstatningsmodstykker, kan de være mere læselige, især for dem med forståelse for regulære udtryk og sed. Dens support for regulære udtryk, sammen med forskellige andre funktioner, betyder, at sed er et langt mere kraftfuldt alternativ. For komplekse krav kan dette gøre det til et foretrukket valg.

    3 Brug af rename-kommandoen

    rename-kommandoen er et Perl-script med support til at køre vilkårlig Perl-kode, optimeret til at håndtere filomdøbning. Dette betyder, at det er meget kraftfuldt, selvom du skal installere det på et system med Perl tilgængeligt.

    Når det er installeret, er rename meget nemt at bruge til enkle opgaver, såsom ændring af filendelser i vores første eksempel:

    rename 's/\txt$/md/' ./*.txt

    Bemærk, hvordan den regulære udtryk er identisk med den i det tilsvarende sed eksempel. Her er fordelen dog i renames håndtering af filnavn inputs. Programmet vil anvende sin erstatning på hver filnavn argument, så brug af en glob, der udvider til alle .txt filer, betyder, at du kan fuldføre opgaven med en én-liner.

    rename-kommandoen understøtter en -n/--dry-run option, som printer et log over potentielle ændringer uden faktisk at omdøbe filer. Dette er et fremragende sikkerhedsnet, som jeg anbefaler, at du bruger hvor det er muligt.

    Du har også brug for blot en én-liners kommando til den anden opgave, selvom den regulære udtryk er lidt mere kompliceret.

    rename 's/(\/\d{4})_.*(\..*)/$1$2/' ./**/*

    Bemærk igen, at dette udnytter den udvidede glob support til rekursive mapper.

    4 Brug zmv med zsh

    Hvis du bruger zsh, Z shell, er der en anden mulighed lige ved hånden, forudsat at du aktiverer den først. zmv er en shell-funktion, der fungerer som en forenklet version af rename. Du skal indlæse det - enten på en sag-for-sag basis eller via et opstartsscript som .zshrc - ved hjælp af denne kommando:

    autoload zmv

    Når det er aktiveret, kan du kalde zmv sådan her for at udføre den første opgave:

    zmv -W '*.txt' '*.md'

    Uden at rename, bringer zmv os tilbage til globbing i stedet for regulære udtryk, så det er lidt mindre kraftfuldt. Men som du kan se fra dette eksempel, er det let at bruge; -W optionen forenkler syntaksen endnu mere end standard.

    Da det er en shell funktion, har zmv ikke en indbygget man-side. Men du kan finde nogle oplysninger om det via man zshcontrib. Især bemærk, at det også understøtter en -n option for at udføre en tør kørsel.

    Da zmv kræver zsh, drager det fordel af den udvidede globbing, som shell'en tilbyder, herunder rekursion i undermapper.

    zmv '(**/)([0-9][0-9][0-9][0-9])_*(.*)' '$1$2$3'

    Uden support for regulære udtryk er dette mønster lidt længere, men stadig meget læseligt.

    5 Brug af mmv

    mmv står for "multiple move" og det er et andet værktøj, der specifikt er designet til at håndtere bulk filomdøbning. Du skal sandsynligvis installere det, men dette er bare et simpelt tilfælde af sudo apt install mmv (Ubuntu), sudo yum install mmv (RHEL/CentOS/Fedora), brew install mmv (Mac), eller det ækvivalente i din foretrukne pakke manager.

    Når det er installeret, kan du bruge værktøjet til let at omdøbe filendelser:

    mmv '*.txt'.

    Den store forskel med mmv

    Den store forskel med mmv er, hvordan det håndterer mønstre og match. Ud over de mest velkendte wildcard-tegn understøtter mmv også et ; wildcard, som du kan bruge til at matche et vilkårligt antal mapper, hvilket understøtter den rekursive natur af den anden opgave:

    mmv -n ';[0-9][0-9][0-9][0-9]_*.*' '#1#2#3#4#5.#7'

    Bemærk også, hvordan mmv understøtter henvisninger til matches, ikke via de typiske parenteser, men ved at tildele et unikt nummer til hvert enkelt wildcard. Dette giver os syv forskellige matches i det endelige erstatningsudtryk: ét for den førende sti matchet af ;, ét for hver af de fire cifre, ét—#6—for eventuelle tegn efter understreget, som vi kassere, og ét for filtypen efter punktummet.
    På grund af denne tilgang kan mmv være for besværligt for opgaver, der involverer for mange wildcards i det indledende mønster. Men når man udfører opgaver som den almindelige udvidelsesudveksling, er det svært at overgå det med hensyn til enkelhed og læsbarhed.

    Muligheder for masseomdøbning

    Selvom der er mange muligheder for masseomdøbning af filer i Linux, kræver hver enkelt lidt tilvænning. Jeg anbefaler at vælge den, der ser mest tilgængelig ud, og lære den at kende så godt som muligt, mens du gør flittig brug af -n/--dry-run-muligheden for de værktøjer, der understøtter det.

    Hvis du er fan af regulære udtryk, er det svært at overgå deres ren magt, og et værktøj som rename vil sandsynligvis tjene dig godt. Hvis du derimod er mere en shell-guru, en troldmand med wildcards, vil du sikkert kunne lide udseendet af zmv eller mmv. Men disse værktøjer er kun gode, hvis du bruger Z-shell eller hvis du installerer dem og lærer deres særprægede syntaks henholdsvis.

    I mellemtiden kan parameterudskiftning være overraskende kraftfuld, og du vil måske gentage din masseomdøbning. Så at skrive et shell-script har yderligere fordele. I sidste ende er valget dit, og alle disse muligheder er at foretrække frem for manuelt at omdøbe hundreder af filer ved hjælp af en GUI. Det er kommandolinjens styrke.

    Skriv et svar

    Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *

    Go up