Zoeken op website

3 manieren om alle bestanden in een map te verwijderen, behalve één of enkele bestanden met extensies


Soms kom je in een situatie terecht waarin je alle bestanden in een map moet verwijderen of eenvoudigweg een map moet opschonen door alle bestanden te verwijderen, behalve bestanden van een bepaald type (eindigend met een bepaalde extensie).

In dit artikel laten we u zien hoe u bestanden in een map verwijdert, met uitzondering van bepaalde bestandsextensies of typen, met behulp van de opdrachten rm, find en globignore.

Voordat we verder gaan, laten we beginnen met een korte blik op één belangrijk concept in Linux: het matchen van bestandsnaampatronen, wat ons in staat zal stellen het onderhavige probleem op te lossen.

Voorgesteld lezen: Gebruik de opdracht find om meerdere bestandsnamen/extensies te doorzoeken in Linux

In Linux is een shell-patroon een tekenreeks die bestaat uit de volgende speciale tekens, waarnaar wordt verwezen als jokertekens of metatekens:

  1. * – komt overeen met nul of meer tekens
  2. ? – komt overeen met elk afzonderlijk teken
  3. [seq] – komt overeen met elk teken in seq
  4. [!seq] – komt overeen met elk teken dat niet in seq staat

Er zijn drie mogelijke methoden die we hier zullen onderzoeken, en deze omvatten:

Bestanden verwijderen met behulp van Extended Pattern Matching-operators

De verschillende operatoren voor uitgebreide patroonvergelijking worden hieronder vermeld, waarbij patroonlijst een lijst is met een of meer bestandsnamen, gescheiden door het teken |:

  1. *(patroonlijst) – komt overeen met nul of meer exemplaren van de opgegeven patronen
  2. ?(patroonlijst) – komt overeen met nul of één exemplaar van de opgegeven patronen
  3. +(patroonlijst) – komt overeen met een of meer exemplaren van de opgegeven patronen
  4. @(patroonlijst) – komt overeen met een van de opgegeven patronen
  5. !(patroonlijst) – komt overeen met alles behalve één van de gegeven patronen

Om ze te gebruiken, schakelt u de shell-optie extglob als volgt in:

shopt -s extglob

1. Om alle bestanden in een map te verwijderen, behalve de bestandsnaam, typt u de onderstaande opdracht:

rm -v !("filename")

2. Om alle bestanden te verwijderen, met uitzondering van bestandsnaam1 en bestandsnaam2:

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

3. In het onderstaande voorbeeld ziet u hoe u alle bestanden, behalve alle .zip-bestanden, interactief kunt verwijderen:

rm -i !(*.zip)

4. Vervolgens kunt u als volgt alle bestanden in een map verwijderen, behalve alle .zip- en .odt-bestanden, terwijl wordt weergegeven wat er wordt klaar:

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

Zodra je alle vereiste commando's hebt, schakel je de shell-optie extglob als volgt uit:

shopt -u extglob

Bestanden verwijderen met Linux find Command

Met deze methode kunnen we de opdracht find uitsluitend gebruiken met de juiste opties of in combinatie met de opdracht xargs door een pijplijn te gebruiken zoals in de onderstaande formulieren:

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. Met de volgende opdracht worden alle bestanden verwijderd, behalve de .gz-bestanden in de huidige map:

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

6. Met behulp van een pipeline en xargs kunt u het bovenstaande geval als volgt aanpassen:

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

7. Laten we nog een voorbeeld bekijken. Met de onderstaande opdracht worden alle bestanden gewist, met uitzondering van .gz, .odt en .jpg-bestanden in de huidige map:

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

Bestanden verwijderen met Bash GLOBIGNORE Variabele

Deze laatste aanpak werkt echter alleen met bash. Hier slaat de GLOBIGNORE variabele een door dubbele punten gescheiden patroonlijst (bestandsnamen) op die moet worden genegeerd door padnaamuitbreiding.

Voorgesteld lezen: Nuttige 12 praktische voorbeelden over Grep Command in Linux

Om deze methode te gebruiken, gaat u naar de map die u wilt opruimen en stelt u vervolgens de GLOBIGNORE variabele als volgt in:

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

In dit geval worden alle andere bestanden dan de bestanden .odt, .iso en .txt uit de huidige map verwijderd.

Voer nu de opdracht uit om de map op te ruimen:

rm -v *

Schakel daarna de GLOBIGNORE variabele uit:

unset GLOBIGNORE

Opmerking: Om de betekenis te begrijpen van de vlaggen die in de bovenstaande commando's worden gebruikt, raadpleegt u de manpagina's van elk commando dat we in de verschillende illustraties hebben gebruikt.

Dat is alles! Als u voor hetzelfde doel andere opdrachtregeltechnieken in gedachten heeft, vergeet dan niet om deze met ons te delen via onze feedbacksectie hieronder.