3 načini za brisanje vseh datotek v imeniku, razen ene ali nekaj datotek z razširitvami


Včasih pridete v situacijo, ko morate izbrisati vse datoteke v imeniku ali preprosto očistiti imenik, tako da odstranite vse datoteke, razen datotek določene vrste (konča se z določeno pripono).

V tem članku vam bomo pokazali, kako z ukazi rm, find in globignore izbrišete datoteke v imeniku, razen določenih končnic ali vrst datotek.

Preden nadaljujemo, začnimo s kratko preučitvijo enega pomembnega koncepta v Linuxu - ujemanja vzorcev datotek, ki nam bo omogočil, da se spoprimemo z našo težavo.

V Linuxu je vzorec lupine niz, ki je sestavljen iz naslednjih posebnih znakov, ki se imenujejo nadomestni znaki ali metaznaki:

  1. * - se ujema z nič ali več znaki
  2. ? - se ujema s katerim koli znakom
  3. [seq] - se ujema s katerim koli znakom v seq
  4. [! seq] - se ujema s katerim koli znakom, ki ni v seq

Tu bomo raziskali tri možne metode, med katerimi so:

Izbrišite datoteke z uporabo razširjenih operaterjev za ujemanje vzorcev

Spodaj so navedeni različni operaterji razširjenega ujemanja vzorcev, kjer je seznam vzorcev seznam z enim ali več imeni datotek, ločenih z znakom | :

  1. * (seznam vzorcev) - se ujema z nič ali več pojavitvami določenih vzorcev
  2. ? (seznam vzorcev) - se ujema z nič ali enim pojavljanjem določenih vzorcev
  3. + (seznam vzorcev) - se ujema z enim ali več pojavitvami določenih vzorcev
  4. @ (seznam vzorcev) - se ujema z enim od določenih vzorcev
  5. ! (seznam vzorcev) - se ujema z vsem, razen z enim od danih vzorcev

Če jih želite uporabiti, omogočite možnost lupine extglob, kot sledi:

# shopt -s extglob

1. Če želite izbrisati vse datoteke v imeniku, razen imena datoteke, vnesite spodnji ukaz:

$ rm -v !("filename")

2. Če želite izbrisati vse datoteke, razen filename1 in filename2:

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

3. Spodnji primer prikazuje, kako odstranite vse datoteke, razen vseh datotek .zip , interaktivno:

$ rm -i !(*.zip)

4. Nato lahko izbrišete vse datoteke v imeniku, razen vseh datotek .zip in .odt , kot sledi, pri tem pa prikažete, kaj je bilo storjeno:

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

Ko imate vse zahtevane ukaze, izklopite možnost lupine extglob tako:

$ shopt -u extglob

Izbrišite datoteke z ukazom Linux find

Pri tej metodi lahko uporabimo ukaz find izključno z ustreznimi možnostmi ali v povezavi z ukazom xargs, tako da uporabimo cevovod kot v spodnjih obrazcih:

$ 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. Naslednji ukaz bo izbrisal vse datoteke razen datotek .gz v trenutnem imeniku:

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

6. Z uporabo cevovoda in xargov lahko zgornji primer spremenite na naslednji način:

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

7. Oglejmo si še en primer, spodnji ukaz bo izbrisal vse datoteke, razen datotek .gz , .odt in .jpg v trenutnem imeniku:

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

Izbrišite datoteke s spremenljivko Bash GLOBIGNORE

Ta zadnji pristop pa deluje samo z bash. Tu spremenljivka GLOBIGNORE shrani seznam vzorcev, ločen z dvopičjem (imena datotek), ki jih ignorira razširitev poti.

Če želite uporabiti to metodo, se premaknite v imenik, ki ga želite očistiti, nato spremenljivko GLOBIGNORE nastavite na naslednji način:

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

V tem primeru bodo iz trenutnega imenika odstranjene vse datoteke, ki niso .odt , .iso in .txt .

Zdaj zaženite ukaz za čiščenje imenika:

$ rm -v *

Nato spremenite spremenljivko GLOBIGNORE:

$ unset GLOBIGNORE

Opomba: Če želite razumeti pomen zastav, uporabljenih v zgornjih ukazih, si oglejte priročne strani vsakega ukaza, ki smo jih uporabili v različnih ilustracijah.

To je vse! Če imate za isti namen v mislih še kakšno drugo tehniko ukazne vrstice, ne pozabite deliti z nami v spodnjem oddelku za povratne informacije.