Hoe verwijder ik in linux alle bestanden BEHALVE het patroon * .txt?

Ik weet hoe ik alle txt bestanden in de huidige directory moet verwijderen door rm *.txt. Weet iemand hoe alle bestanden in de huidige map moeten worden verwijderd, BEHALVE txt bestand?

Opmerkingen

  • As test altijd de gegeven antwoorden met een onschadelijk commando zoals ls voordat je daadwerkelijk probeert rm aan te roepen.
  • ^ Dit kerel ' houdt er niet van om gevaarlijk te leven .. 🙂

Antwoord

Je kunt find gebruiken:

find . -type f ! -name "*.txt" -delete 

Of bash “s uitgebreide globbing-functies:

shopt -s extglob rm *.!(txt) 

Of in zsh:

setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything 

Opmerkingen

  • Sommige hiervan moeten mogelijk worden aangepast, afhankelijk van of u mappen heeft en wat u ermee wilt doen.
  • Moet niet ' t *.!(txt) be !(*.txt)?
  • @LauriRanta hangt af van wat ' s in de map, die we hebben ' t kreeg een antwoord op. Het ' is prima als alle bestanden extensies hebben, en rm zou stikken als er mappen waren.
  • Ik ' heb een probleem met de haakjes. Wanneer ik de globbing-stijl in een bash-script gebruik, klaagt het over een syntaxisfout en de haakjes. Het werkt echter vanuit de CLI.
  • @izogfif controleer of dit find . -type f ! -name "*.txt" | xargs -r rm zou werken in GNU \ xargs. BSD- en UNIX-xargs-commandos hebben misschien niet -r je hoeft je lokale man xargs

Answer

Als u alleen alle bestanden wilt verwijderen behalve “* .txt”, dan kunt u gebruik het volgende commando:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

maar als je ook wilt verwijderen directories samen met de bestanden, dan kun je dit gebruiken:

$ find . ! -name "*.txt" -exec rm -r {} \;

Antwoord

er zijn veel manieren om dit te doen. maar de meest eenvoudige manier zou zijn (bash):

shopt -s extglob rm !(*.txt) 

Reacties

  • Hoe kan ik gebruiken dit om meerdere extensies te specificeren?
  • shopt -s extglob is krachtig. tecmint.com/… geeft goede voorbeelden. Om alle behalve bepaalde extensies te verwijderen, werkt rm -v !(*.zip|*.odt).

Antwoord

U kunt omgekeerde grep en xargs gebruiken

ls | grep -v .txt$| xargs rm 

Reacties

  • ls | grep -v *.txt | xargs rm werkt net zo goed
  • @phillipsk grep -v *.txt werkt alleen als er ' s precies één .txt bestand. Als er geen is, gebruikt grep *.txt als het patroon; als er ' s meer dan één zijn, zal het zoeken naar de eerste bestandsnaam in alle andere .txt bestanden, waarbij de uitvoer van ls. (Exacte resultaten kunnen afhankelijk zijn van de shell ' s glob-opties.)
  • .txt$ zal overeenkomen met strings die eindigen op txt ongeacht de punt. Omdat grep reguliere expressie als parameter aanneemt. Dus bestanden a.txt en aatxt en a-txt komen allemaal overeen met deze uitdrukking. De juiste uitdrukking moet ls | grep -v \\.txt$ | xargs --no-run-if-empty rm zijn. Voor nieuwsgierige mensen: als je veilig met de uitdrukking wilt spelen, gebruik dan deze testuitdrukking ls | grep \\.txt$ | xargs --no-run-if-empty echo (let op: er ' s geen -v vlag en rm=>echo). Opmerking 2: je hebt misschien dubbele backslash opgemerkt. De ene is voor regex, de andere is voor bash om te ontsnappen aan de slash.

Answer

Een oplossing zonder find:

mv dir/*.txt otherdir/ rm -r dir mv otherdir dir 

Dit zou op alle soorten shells moeten werken.

Antwoord

Gewoon doen:

rm $(ls -I "*.txt" ) # Verwijdert bestandstype behalve * .txt

Evenzo, als u “behalve een of meer bestandstypen” wilt verwijderen, doet u:

rm $(ls -I "*.txt" -I "*.pdf" ) #Verwijdert bestandstypen behalve * .txt & * .pdf

Opmerkingen

  • Welkom bij StackExchange!De -I optie kan handig zijn, maar zie waarom ls niet ontleden . En wat bereikt de | xargs? Zonder enige argumenten, voert het gewoon echo uit op al zijn invoer.
  • Wat moet xargs bereiken?
  • Bedankt, xargs was niet nuttig in het bovenstaande geval, nu gecorrigeerd.

Antwoord

Dit werkt ook om alle verborgen (punt) bestanden en mappen te verwijderen behalve de vermelde (.mydir):

rm -rf $(ls -aI ".mydir") 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *