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:
*
– samsvarer med null eller flere tegn?
– samsvarer med et enkelt tegn[seq]
– samsvarer med alle tegn i seq[!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:
*(mønster-liste)
– samsvarer med null eller flere forekomster av de angitte mønstrene?(mønsterliste)
– samsvarer med null eller én forekomst av de angitte mønstrene- +(mønster-liste) – samsvarer med én eller flere forekomster av de angitte mønstrene
@(pattern-list)
– samsvarer med et av de angitte mønstrene!(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.