3 načina za brisanje svih datoteka u direktoriju osim jedne ili nekoliko datoteka s ekstenzijama


Ponekad dođete u situaciju da trebate izbrisati sve datoteke u direktoriju ili jednostavno očistiti direktorij uklanjanjem svih datoteka osim datoteka određenog tipa (koje završavaju određenom ekstenzijom).

U ovom članku ćemo vam pokazati kako da izbrišete datoteke u direktoriju osim određenih ekstenzija ili tipova datoteka pomoću naredbi rm, find i globignore.

Prije nego što krenemo dalje, počnimo tako što ćemo ukratko pogledati jedan važan koncept u Linuxu – podudaranje obrasca naziva datoteke, što će nam omogućiti da se pozabavimo našim problemom.

Predloženo čitanje: Koristite naredbu find za pretraživanje više naziva datoteka/ekstenzija u Linuxu

U Linuxu, shell obrazac je niz koji se sastoji od sljedećih posebnih znakova, koji se nazivaju zamjenski znakovi ili metaznakovi:

  1. * – odgovara nula ili više znakova
  2. ? – odgovara bilo kojem pojedinačnom znaku
  3. [seq] – odgovara bilo kojem znaku u sq
  4. [!seq] – odgovara bilo kojem znaku koji nije u sekvenci

Postoje tri moguća metoda koje ćemo ovdje istražiti, a one uključuju:

Izbrišite datoteke pomoću operatora proširenog podudaranja uzoraka

Različiti operatori proširenog podudaranja uzoraka navedeni su u nastavku, gdje je pattern-list lista koja sadrži jedan ili više naziva datoteka, odvojenih znakom |:

  1. *(pattern-list) – odgovara nula ili više pojavljivanja navedenih obrazaca
  2. ?(pattern-list) – odgovara nuli ili jednom pojavljivanju specificiranih obrazaca
  3. +(list-pattern-list) – odgovara jednom ili više pojavljivanja navedenih obrazaca
  4. @(pattern-list) – odgovara jednom od navedenih obrazaca
  5. !(pattern-list) – odgovara bilo čemu osim jednom od datih obrazaca

Da ih koristite, omogućite opciju extglob shell na sljedeći način:

shopt -s extglob

1. Da izbrišete sve datoteke u direktoriju osim naziva fajla, upišite naredbu ispod:

rm -v !("filename")

2. Da izbrišete sve fajlove sa izuzetkom filename1 i filename2:

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

3. Primjer ispod pokazuje kako interaktivno ukloniti sve datoteke osim svih .zip datoteka:

rm -i !(*.zip)

4. Zatim možete izbrisati sve datoteke u direktoriju osim svih .zip i .odt datoteka na sljedeći način, dok prikazujete ono što se događa urađeno:

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

Kada imate sve potrebne komande, isključite opciju extglob shell na sljedeći način:

shopt -u extglob

Brisanje datoteka pomoću Linux komande find

Pod ovom metodom, možemo koristiti naredbu find isključivo sa odgovarajućim opcijama ili u kombinaciji sa naredbom xargs korištenjem cjevovoda kao u obrascima ispod:

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. Sljedeća komanda će izbrisati sve datoteke osim .gz datoteka u trenutnom direktoriju:

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

6. Koristeći pipeline i xargs, možete modificirati gornji slučaj na sljedeći način:

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

7. Pogledajmo još jedan primjer, naredba u nastavku će izbrisati sve datoteke osim .gz, .odt i .jpg datoteke u trenutnom direktoriju:

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

Izbrišite datoteke pomoću Bash GLOBIGNORE varijable

Ovaj posljednji pristup, međutim, radi samo sa bash-om. Ovdje varijabla GLOBIGNORE pohranjuje listu uzoraka razdvojenih dvotočkama (imena datoteka) koje će se zanemariti proširenjem imena putanje.

Preporučeno čitanje: Korisnih 12 praktičnih primjera naredbe Grep u Linuxu

Da biste koristili ovu metodu, idite u direktorij koji želite očistiti, a zatim postavite varijablu GLOBIGNORE na sljedeći način:

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

U ovom slučaju, svi fajlovi osim .odt, .iso i .txt fajlovi se uklanjaju iz trenutnog direktorija.

Sada pokrenite naredbu da očistite direktorij:

rm -v *

Nakon toga isključite varijablu GLOBIGNORE:

unset GLOBIGNORE

Napomena: Da biste razumjeli značenje oznaka korištenih u gornjim naredbama, pogledajte man stranice svake komande koju smo koristili u različitim ilustracijama.

To je sve! Ako imate na umu bilo koju drugu tehniku komandne linije za istu svrhu, ne zaboravite podijeliti s nama putem našeg odjeljka za povratne informacije u nastavku.