3 måter å slette alle filer i en katalog unntatt én eller få filer med utvidelser


Noen ganger kommer du i en situasjon der du trenger å slette alle filer i en katalog eller bare rydde opp i en katalog ved å fjerne alle filer unntatt filer av en gitt type (som slutter med en bestemt utvidelse).

I denne artikkelen vil vi vise deg hvordan du sletter filer i en katalog bortsett fra visse filutvidelser eller typer ved å bruke kommandoene rm, find og globignore.

Før vi går videre, la oss starte med å ta en kort titt på ett viktig konsept i Linux – filnavnmønstertilpasning, som vil gjøre oss i stand til å håndtere problemet vårt.

I Linux er et skallmønster en streng som består av følgende spesialtegn, som omtales som jokertegn eller metategn:

  1. * – samsvarer med null eller flere tegn
  2. ? – samsvarer med et enkelt tegn
  3. [seq] – samsvarer med alle tegn i seq
  4. [!seq] – samsvarer med ethvert tegn som ikke er i seq

Det er tre mulige metoder vi skal utforske her, og disse inkluderer:

Slett filer ved å bruke utvidede mønstertilpasningsoperatører

De forskjellige utvidede mønstertilpasningsoperatørene er oppført nedenfor, der mønsterliste er en liste som inneholder ett eller flere filnavn, atskilt med |-tegnet:

  1. *(mønster-liste) – samsvarer med null eller flere forekomster av de angitte mønstrene
  2. ?(mønsterliste) – samsvarer med null eller én forekomst av de angitte mønstrene
  3. +(mønster-liste) – samsvarer med én eller flere forekomster av de angitte mønstrene
  4. @(pattern-list) – samsvarer med et av de angitte mønstrene
  5. !(pattern-list) – samsvarer med alt unntatt ett av de gitte mønstrene

For å bruke dem, aktiver extglob shell-alternativet som følger:

# shopt -s extglob

1. For å slette alle filer i en katalog unntatt filnavn, skriv inn kommandoen nedenfor:

$ rm -v !("filename")

2. Slik sletter du alle filer med unntak av filnavn1 og filnavn2:

$ rm -v !("filename1"|"filename2") 

3. Eksemplet nedenfor viser hvordan du fjerner alle andre filer enn alle .zip-filer interaktivt:

$ rm -i !(*.zip)

4. Deretter kan du slette alle filer i en katalog bortsett fra alle .zip- og .odt-filer som følger, mens du viser hva som gjøres:

$ rm -v !(*.zip|*.odt)

Når du har alle nødvendige kommandoer, slå av extglob shell-alternativet slik:

$ shopt -u extglob

Slett filer ved hjelp av Linux find Command

Under denne metoden kan vi bruke find-kommando utelukkende med passende alternativer eller i forbindelse med xargs-kommando ved å bruke en pipeline som i skjemaene nedenfor:

$ find /directory/ -type f -not -name 'PATTERN' -delete
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}

5. Følgende kommando vil slette alle filer bortsett fra .gz-filer i gjeldende katalog:

$ find . -type f -not -name '*.gz'-delete

6. Ved å bruke en pipeline og xargs kan du endre saken ovenfor som følger:

$ find . -type f -not -name '*gz' -print0 | xargs -0  -I {} rm -v {}

7. La oss se på ett ekstra eksempel, kommandoen nedenfor vil slette alle filer unntatt .gz, .odt og .jpg filer i gjeldende katalog:

$ find . -type f -not \(-name '*gz' -or -name '*odt' -or -name '*.jpg' \) -delete

Slett filer ved å bruke Bash GLOBIGNORE-variabelen

Denne siste tilnærmingen fungerer imidlertid bare med bash. Her lagrer GLOBIGNORE-variabelen en kolonseparert mønsterliste (filnavn) som skal ignoreres ved utvidelse av banenavn.

For å bruke denne metoden, gå inn i katalogen du ønsker å rydde opp i, og sett deretter GLOBIGNORE-variabelen som følger:

$ cd test
$ GLOBIGNORE=*.odt:*.iso:*.txt

I dette tilfellet fjernes alle andre filer enn .odt, .iso og .txt filer fra gjeldende katalog.

Kjør nå kommandoen for å rydde opp i katalogen:

$ rm -v *

Deretter slår du av GLOBIGNORE-variabelen:

$ unset GLOBIGNORE

Merk: For å forstå betydningen av flaggene som brukes i kommandoene ovenfor, se man-sidene for hver kommando vi har brukt i de forskjellige illustrasjonene.

Det er alt! Hvis du har andre kommandolinjeteknikker i tankene for samme formål, ikke glem å dele med oss via tilbakemeldingsdelen nedenfor.