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:
-
*
- matcher nul eller flere tegn -
?
- matcher ethvert enkelt tegn -
[seq]
- matcher ethvert tegn i seq -
[! 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 |
:
-
* (mønsterliste)
- matcher nul eller flere forekomster af de angivne mønstre -
? (mønsterliste)
- matcher nul eller en forekomst af de angivne mønstre - + (mønsterliste) - matcher en eller flere forekomster af de angivne mønstre
-
@ (mønsterliste)
- matcher et af de angivne mønstre -
! (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.