Vad är globbing och hur använder jag det i Linux?

Vad är globbing och hur använder jag det i Linux?
Index
  1. Vad är globbing?
  2. Hur fungerar globbing?
  3. Vad annat kan globbing göra?

Globbing förenklar filhantering i kommandoraden genom att använda mönster istället för exakta matchningar. Lär dig behärska denna viktiga teknik för effektiv filhantering.

Globbing är som reguljära uttryck för dina filnamn. Tyvärr missförstås det ofta, trots att det är en viktig färdighet för kommandoraden som alla åtminstone har någon kunskap om. Omvandla den ytliga kunskapen till en djupare förståelse.

Vad är globbing?

“Globbing” är en informell version av termen “filnamnsutvidgning.” Med hjälp av speciella mönster kan du identifiera filnamn baserat på mönster i stället för exakta bokstavliga matchningar.

Det första exemplet på globbing som alla stöter på ser ut så här:

ls *.txt

Detta visar en lista med filer vars namn slutar med tillägget ".txt" i din aktuella katalog. I detta exempel matchar * vilken som helst sträng, inklusive ingen alls, så det skulle matcha filer med dessa namn:

  • about.txt
  • ett filnamn med mellanslag.txt

Det skulle inte matcha:

[enlazatom_show_links]

Gömd filer som börjar med en . är ett särskilt fall. För att matcha gömda filer måste du börja ditt mönster med en “.”-karaktär.

Det finns bara två andra typer av matchningar i standardfallet. Mönstret ? matchar en enda karaktär: precis en. Och mönstret [...] matchar en enda karaktär från den avgränsade uppsättningen, vilken också kan inkludera intervall (som a-z) och teckenkategorier (som :digit:).

Med bara dessa regler kan du bygga ganska sofistikerade mönster för att matcha olika uppsättningar av filer, beroende på dina behov. Så, till exempel, kan du använda ls [amz]*[:digit:].?? för att visa alla filer som börjar med a, m eller z och slutar med en siffra följt av en punkt och en tillägg av exakt två bokstäver.

Ibland kan du se ett mönster som involverar klamrar, som ls *.{md,markdown}, vilket listar alla filer som slutar med antingen tillägg. Techniskt sett är denna klamratvidgning separat från globbing-processen, men det är vanligt att använda de två tillsammans.

Hur fungerar globbing?

Globbing hanteras av din skal, inte av kommandot som du kör. Tänk på vad som händer när du kör ls *.txt. Du kanske tror att ls-programmet får “*.txt” som argument, beräknar vilka filer som mönstret matchar och skriver ut resultaten.

Faktum är att skalet ansvarar för att omvandla “*.txt” till “foo.txt,” “hello.txt,” osv. Det skickar sedan dessa värden till ls-kommandot som argument. Så ls behöver aldrig oroa sig för att hantera "*.txt"; skalet hanterar det.

Detta orsakar ett vanligt problem med kommandon som find:

find . -name *.txt

När du kör det här kommandot skulle du förvänta dig att find skulle lokalisera alla textfiler i den aktuella katalogen och alla dess underkataloger. Istället gör Bash följande:

  • Ser “*” och omvandlar “*.txt” till en lista med matchande filnamn, som alla kommer från den aktuella katalogen endast.
  • Kör kommandot, t.ex. find . -name filea.txt fileb.txt filec.txt.

Bekräfta kommandot som ditt skal faktiskt kommer att köra i förväg genom att före prefixa det med echo:

Problemet nu är att find klagar över en “okänd primär eller operator;” och du kommer förmodligen att stå där och fundera på vad det betyder!

-name alternativet (find kallar detta en “primär”) kan bara ta ett argument själv, så find blir förvirrad när det ser “fileb.txt,” och ger upp. Det korrekta sättet att köra det här kommandot är:

find . -name '*.txt'

Att citera uttrycket—med antingen enkla eller dubbla citat—betyder att skalet inte kommer att utföra filnamnsutvidgning, utan istället skicka mönstret till find.

Vad annat kan globbing göra?

I Bash är de grundläggande globbing-tecknen *, ?, och [...]. Men Bash stödjer en utvidgad uppsättning jokertecken med mer funktionalitet. Detta är främst för att stödja upprepade mönster och gör globbing mer likt fullständiga reguljära uttryck.

Utökat globbing är vanligtvis aktiverat som standard, men om det inte är det (t.ex. i Bash 3.2 på macOS) måste du göra det med det här kommandot:

shopt -s extglob

När det är aktiverat kan du använda följande:

    • ?(mönster-lista) för att matcha 0 eller 1 förekomst av de angivna mönstren.
    • *(mönster-lista) för att matcha 0 eller fler förekomster av de angivna mönstren.
      • +(mönster-lista) för att matcha 1 eller flera förekomster av de angivna mönstren.
      • @(mönster-lista) för att matcha 1 av de angivna mönstren.
      • !(mönster-lista) för att matcha allt utom ett av de angivna mönstren.

Till exempel kan du matcha filer som heter "a," "aa," och "aaaaaa" med glob-mönstret +(a). Du kan matcha filerna "README.md," "README.txt," och "README" med mönstret README?(.md|.txt).

Om du är bekant med reguljära uttryck, är det lätt att glömma att globs är implicit förankrade. Det betyder att ett mönster som +(a) endast kommer att matcha filer som enbart består av tecknet "a," snarare än någon fil som innehåller minst ett "a" tecken någonstans i mitten.

Eftersom globbing hanteras av din shell kan den stöttade syntaxen variera, så du bör alltid kontrollera dokumentationen för din shell. Zsh-shell stöder också grunderna, men erbjuder en utökad syntax som är närmare reguljära uttryck. Till exempel stöder Zsh gruppering med parenteser, vilket liknar Bashs utökade syntax:

ls (fil1|fil2) 

Många shell, inklusive Bash och Zsh, lägger till en rekursiv globbing-funktion, där du kan expandera filmatchningar rekursivt. Med detta kan du matcha noll eller fler kataloger med mönstret **. Så ls **/*.txt kommer att hitta alla .txt-filer i den aktuella katalogen eller någon av dess underkataloger, på valfri djup:

I Bash är detta en annan valfri shell-inställning, så du behöver aktivera den:

shopt -s globstar

Det är värt att behärska den grundläggande, POSIX-kompatibla syntaxen för globbing: ?, *, och [...]. Med dessa mönster kommer du att kunna hantera grupper av filer effektivt, vilket sparar värdefullt skrivande. Om du är engagerad i en särskild shell, får du en liten bonus av att lära dig dess utökade syntax.

Nu när du har läst klart Vad är globbing och hur använder jag det i Linux?, inbjuder vi dig att utforska kategorin Linux ytterligare. Där hittar du fler intressanta artiklar som kommer att utöka dina kunskaper och hålla dig informerad. Sluta inte läsa och upptäcka mer!

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Go up