3 måder at slette alle filer i et bibliotek undtagen en eller få filer med udvidelser


Nogle gange kommer du i en situation, hvor du har brug for at slette alle filer i en mappe eller blot rydde en mappe op ved at fjerne alle filer undtagen filer af en given type (slutter med en bestemt udvidelse).

I denne artikel viser vi dig, hvordan du sletter filer i et bibliotek undtagen visse filtypenavne eller -typer ved hjælp af kommandoer rm, find og globignore.

Før vi går videre, lad os starte med kort at se på et vigtigt koncept i Linux - filnavnmatchning, som gør det muligt for os at håndtere vores aktuelle problem.

I Linux er et shell-mønster en streng, der består af følgende specialtegn, der kaldes jokertegn eller metategn:

  1. * - matcher nul eller flere tegn
  2. ? - matcher ethvert enkelt tegn
  3. [seq] - matcher ethvert tegn i seq
  4. [! seq] - matcher ethvert tegn, der ikke er i seq

Der er tre mulige metoder, vi skal undersøge her, og disse inkluderer:

Slet filer ved hjælp af udvidede mønstermatchende operatører

De forskellige udvidede mønster matchende operatører er angivet nedenfor, hvor mønster-liste er en liste, der indeholder et eller flere filnavne, adskilt ved hjælp af tegnet | :

  1. * (mønsterliste) - matcher nul eller flere forekomster af de angivne mønstre
  2. ? (mønsterliste) - matcher nul eller en forekomst af de angivne mønstre
  3. + (mønsterliste) - matcher en eller flere forekomster af de angivne mønstre
  4. @ (mønsterliste) - matcher et af de angivne mønstre
  5. ! (mønsterliste) - matcher alt undtagen et af de givne mønstre

For at bruge dem skal du aktivere extglob shell-indstillingen som følger:

# shopt -s extglob

1. For at slette alle filer i et bibliotek undtagen filnavn skal du skrive kommandoen nedenfor:

$ rm -v !("filename")

2. Sådan slettes alle filer med undtagelse af filnavn1 og filnavn2:

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

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

$ rm -i !(*.zip)

4. Dernæst kan du slette alle filer i en mappe bortset fra alle .zip og .odt filer som følger, mens du viser hvad der gøres:

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

Når du har alle de krævede kommandoer, skal du slukke for extglob shell-indstillingen sådan:

$ shopt -u extglob

Slet filer ved hjælp af Linux find Command

Under denne metode kan vi udelukkende bruge find-kommando med passende indstillinger eller i forbindelse med xargs-kommando ved at anvende en pipeline som i nedenstående formularer:

$ 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 sletter alle filer bortset fra .gz filer i det aktuelle bibliotek:

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

6. Ved hjælp af en rørledning og xargs kan du ændre sagen ovenfor som følger:

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

7. Lad os se på et ekstra eksempel, kommandoen nedenfor vil udslette alle filer undtagen .gz , .odt og .jpg filer i det aktuelle bibliotek:

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

Slet filer ved hjælp af Bash GLOBIGNORE-variabel

Denne sidste tilgang fungerer dog kun med bash. Her gemmer GLOBIGNORE-variablen en kolon-adskilt mønsterliste (filnavne), der skal ignoreres af udvidelsen af stienavn.

For at anvende denne metode skal du flytte ind i den mappe, du vil rydde op, og derefter indstille GLOBIGNORE-variablen som følger:

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

I dette tilfælde fjernes alle andre filer end .odt , .iso og .txt filer fra det aktuelle bibliotek.

Kør nu kommandoen for at rydde op i biblioteket:

$ rm -v *

Derefter skal du slå GLOBIGNORE-variablen fra:

$ unset GLOBIGNORE

Bemærk: For at forstå betydningen af de flag, der er anvendt i kommandoerne ovenfor, henvises til man-siderne for hver kommando, vi har brugt i de forskellige illustrationer.

Det er alt! Hvis du har andre kommandolinjeteknikker i tankerne til det samme formål, skal du ikke glemme at dele med os via vores feedback-afsnit nedenfor.