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:
-
*
- se ujema z nič ali več znaki -
?
- se ujema s katerim koli znakom -
[seq]
- se ujema s katerim koli znakom v seq -
[! 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 |
:
-
* (seznam vzorcev)
- se ujema z nič ali več pojavitvami določenih vzorcev -
? (seznam vzorcev)
- se ujema z nič ali enim pojavljanjem določenih vzorcev - + (seznam vzorcev) - se ujema z enim ali več pojavitvami določenih vzorcev
-
@ (seznam vzorcev)
- se ujema z enim od določenih vzorcev -
! (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.