2013-01-08 12:17:05 +0000 2013-01-08 12:17:05 +0000
123
123

Hoe verwijder ik alle bestanden in een map, behalve enkele?

Ik moet alle bestanden in een map verwijderen, maar sommige bestanden uitsluiten. Bijvoorbeeld, in een directory met de bestanden a b c ... z, moet ik alles verwijderen behalve de bestanden u en p. Is er een gemakkelijke manier om dit te doen?

Antwoorden (17)

144
144
144
2013-01-08 12:34:49 +0000

Om rm alles behalve u,p in bash gewoon typen:

rm !(u|p)

Hiervoor moet de volgende optie zijn ingesteld:

shopt -s extglob

Zie meer: glob - Greg’s Wiki ](http://mywiki.wooledge.org/glob)

108
108
108
2013-01-08 12:18:23 +0000

Wat ik in die gevallen doe is

rm *

Dan druk ik op Ctrl+X,* om expand * in alle zichtbare bestandsnamen.

Dan kan ik gewoon de twee bestanden die ik wil behouden uit de lijst verwijderen en tenslotte de commandoregel uitvoeren.

71
71
71
2013-01-08 12:35:05 +0000

Je kunt find

find . ! -name u ! -name p -maxdepth 1 -type f -delete
  • ! ontkent de volgende expressie
  • -name specificeert een bestandsnaam
  • -maxdepth 1 laat find alleen de opgegeven directory verwerken (find gaat standaard door directories heen)
  • -type f zal alleen bestanden verwerken (en niet bijvoorbeeld directories)
  • -delete zal de bestanden verwijderen. -print verwijdert de bestanden

Je kunt de voorwaarden aanpassen door op de man page van find

Update

  • Onthoud dat de volgorde van de elementen van de expressies belangrijk is (zie de documentatie)
  • Test je commando eerst door -delete te gebruiken in plaats van 0x6&
43
43
43
2013-01-08 12:22:58 +0000

Simpel:

mv de bestanden die je wilt in een bovenste directory, rm de directory en dan mv ze terug.

15
15
15
2013-01-08 14:22:21 +0000

Enigszins vergelijkbaar met dit antwoord maar er zijn geen speciale opties nodig, voor zover ik weet is het volgende “oude” functionaliteit die ondersteund wordt door elke (vaag) /bin/sh gelijkende shell (b.v. bash, zsh, ksh, etc)

rm [^up]
11
11
11
2013-01-09 03:54:14 +0000

Het doen zonder te vinden:

ls | grep -v '(u|p)' | xargs rm

(Bewerk: “u” en “v”, zoals op andere plaatsen hier, worden gebruikt als generieke versies van hele regexen. Uiteraard moet je voorzichtig zijn met het verankeren van je regexen om te voorkomen dat ze met te veel dingen overeenkomen).

Je hebt zeker een script nodig als je veel van dit gaat doen, zoals anderen hebben voorgesteld.

6
6
6
2013-01-09 22:34:13 +0000

In zsh:

setopt extended_glob # probably in your .zshrc

dan

rm ^(u|p)

of

rm *~(u|p)

De tweede zal zelfs werken als je ^ in $histchars hebt voor history substitutie, en natuurlijk kun je een arbitraire glob voor de ~ zetten.

5
5
5
2013-01-08 16:32:06 +0000

GLOBIGNORE neemt een door een dubbele punt gescheiden lijst

GLOBIGNORE=u:p
rm *
3
3
3
2013-01-08 17:58:46 +0000
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;

Dit verwijdert alle bestanden behalve u en p in unix

3
3
3
2013-01-08 17:02:15 +0000

In het floppy tijdperk had ik een dos executable genaamd “Except” dat tijdelijk dingen uit de huidige directory zou verplaatsen en een commando zou uitvoeren, dus je kon zeggen:

except \*.txt del \*.\*

om alles te verwijderen behalve je tekstbestanden.

Dit zou een vrij triviaal iets zijn om te implementeren als een shell script en als dit het soort ding is dat je waarschijnlijk meer dan twee keer zult doen, lijkt het een goed idee.

2
2
2
2013-01-08 18:16:45 +0000

Voor diegenen die er de voorkeur aan geven om willekeurig complexe uitsluitingspatronen te specificeren (die alle betrokken bestandsnamen omvatten) in een volwaardige regexp emacs, posix-awk of posix-extended stijl (zie find man page) zou ik deze willen aanbevelen. Het sluit u en p uit in de huidige dir in dit voorbeeld. Dit kan handig zijn voor scripts.

find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
1
1
1
2014-09-24 03:05:26 +0000

Nog een andere:

for FILE in ./*; do if [[$FILE != ./u*]] || [[$FILE != ./p*]];then rm $FILE; fi; done;

Het is nogal lang en ik weet niet of je er gemakkelijk een functie van zou kunnen maken die gemakkelijk een willekeurig aantal argumenten kan bevatten, maar het werkt goed.

En het is pure bash goedheid.

1
1
1
2014-10-22 12:37:57 +0000

Hier is nog een variant. Je kunt typen:

rm -i *

of:

rm --interactive *

Dus rm zal je vragen om het verwijderen van elk bestand te bevestigen.

1
1
1
2016-09-11 02:33:03 +0000

Gebruik:

find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete

om alle bestanden te verwijderen, inclusief directories, behalve u, p en .ext bestanden.

1
1
1
2013-01-09 20:54:59 +0000

Ik gebruik altijd:

rm [a-o,q-t,v-z]*

Hiermee kun je bepalen hoe granulair je het wilt maken. Dus als je a tot en met o en Z bestanden wilt verwijderen kun je gebruiken:

rm [a-o,z]*
1
1
1
2013-04-01 12:44:13 +0000

Nog een versie die xargs gebruikt:

ls -1 | grep -v do_not_delete | xargs -I files rm "files"

Merk op dat xargs -I nodig is om bestandsnamen met spaties correct te behandelen.

0
0
0
2013-10-22 07:06:44 +0000

Een eenvoudige manier die moeilijk te verknoeien is: stel dat je alles wilt wissen behalve *.pdf:

mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp