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
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 lokaleman 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, werktrm -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, gebruiktgrep
*.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 vanls
. (Exacte resultaten kunnen afhankelijk zijn van de shell ' s glob-opties.) -
.txt$
zal overeenkomen met strings die eindigen optxt
ongeacht de punt. Omdatgrep
reguliere expressie als parameter aanneemt. Dus bestandena.txt
enaatxt
ena-txt
komen allemaal overeen met deze uitdrukking. De juiste uitdrukking moetls | grep -v \\.txt$ | xargs --no-run-if-empty rm
zijn. Voor nieuwsgierige mensen: als je veilig met de uitdrukking wilt spelen, gebruik dan deze testuitdrukkingls | grep \\.txt$ | xargs --no-run-if-empty echo
(let op: er ' s geen-v
vlag enrm=>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 gewoonecho
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")
ls
voordat je daadwerkelijk probeertrm
aan te roepen.