Vraag Hoe kan ik alle bestanden van een specifieke extensie in de huidige map recursief verwijderen?


Hoe verwijder ik veilig alle bestanden met een specifieke extensie (bijv. .bak) uit de huidige map en alle submappen via één opdrachtregel? Gewoon, ik ben bang om te gebruiken rm omdat ik het een keer verkeerd heb gebruikt en nu heb ik advies nodig.


421
2017-11-15 13:03


oorsprong




antwoorden:


Je hoeft het niet eens te gebruiken rm in dit geval als je bang bent. Gebruik find:

find . -name "*.bak" -type f -delete

Maar gebruik het met voorzorg. Voer eerst uit:

find . -name "*.bak" -type f

om precies te zien welke bestanden u wilt verwijderen.

Ook, zeker weten dat -delete is het laatste argument in jouw opdracht. Als je het voor de -name *.bak argument, het zal alles verwijderen.

Zien man find en man rm voor meer info en bekijk ook deze gerelateerde vraag over SE:


660
2017-11-15 13:08



Hoe is dit anders rm *.bak? - sayantankhan
@ Bolt64 Your rm *.bak werkt niet voor submappen. - Radu Rădeanu
Met standaardinstellingen rm *.bak verwijdert alleen alle bestanden die eindigen op .bak in de huidige map. Om ook dingen in subdirectories te doen, moest je of knoeien met klodders, de -r optie gebruiken of het vindvoorbeeld gebruiken. - Hennes
@Hennes Wees voorzichtig met rm -r *.bak! Het verwijdert ook directories die eindigen op .bak met al hun inhoud. - Radu Rădeanu
Zorg ervoor dat dat -delete is het laatste argument in uw opdracht. Als je het voor de -name *.bak argument, het zal alles verwijderen. - Michael


find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f

32
2018-04-04 19:10



Welkom bij askubuntu! Hoewel dit een volkomen geldig antwoord is, denk ik niet dat er enig voordeel is bij het gebruik van dit in plaats van het -delete vlag van find. Meer informatie is te vinden in de GNU-handleidingen-invoer voor het verwijderen van bestanden met find. - Glutanimate
je hebt waarschijnlijk gelijk, het is gewoon een alternatieve oplossing, misschien meer rauw;) - lokers
Dit is niet alleen een alternatief maar een voorbeeld van hoe andere commando's gecombineerd kunnen worden met de pipe '|'. 1 - Boris Pavlović
Deze alternatieve oplossingen werken op andere omgevingen die ontbreken - verwijderen (zoals cygwin) - ciriarte
Ik denk dat dit het beste antwoord is hier. - Léo Léopold Hertz 준영


Voer eerst het commando uit shopt -s globstar. U kunt dat uitvoeren op de opdrachtregel en het heeft alleen effect in dat shell-venster. Je kunt het in je plaatsen .bashrcen dan zullen alle nieuw gestarte shells het oppakken. Het effect van dat commando is te maken **/ vergelijk bestanden in de huidige map en de bijbehorende submappen op recursieve wijze (standaard, **/ betekent hetzelfde als */: alleen in de directe submappen). Dan:

rm **/*.bak

(of gvfs-trash **/*.bak of wat heb je).


28
2017-11-15 18:59





Bestanden verwijderen is voor mij niet iets dat je zou moeten gebruiken rm voor. Hier is een alternatief:

sudo apt-get install gvfs     # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash"    # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak                   # trash the files (thus moving them to the trash bin)

Zoals Flimm in de comments stelt:

Het pakket trash-cli doet hetzelfde gvfs-trash zonder de afhankelijkheid van gvf's.

Zo:

sudo apt-get install trash-cli

U hoeft hier geen alias voor te maken, omdat het trash-cli pakket geeft een commando trash, wat doet wat we willen.

Zoals Eliah Kagan in uitgebreide opmerkingen duidelijk maakt, kun je dit recursief ook gebruiken find. In dat geval kunt u geen alias gebruiken, dus de onderstaande opdrachten gaan ervan uit dat u deze hebt geïnstalleerd trash-cli. Ik vat de opmerkingen van Eliah samen:

Met deze opdracht wordt alles gevonden en weergegeven .bak bestanden en symlinks overal in de huidige map of zijn submappen of daaronder.

find . -name '*.bak' -xtype f

Als u ze wilt verwijderen, voegt u een toe -exec met de trash opdracht:

find . -name '*.bak' -xtype f -exec trash {} +

-xtype f selecteert bestanden en symlinks naar bestanden, maar geen mappen. Als u ook .bak-mappen wilt verwijderen, verwijdert u dat gedeelte en gebruikt u -execdir, wat vermijdt cannot trash non-existent fouten voor .bak bestanden binnen .bak directories:

find . -name '*.bak' -execdir trash {} +

19
2017-11-15 13:52



"Niet gebruiken rm om dingen te verwijderen "is een controversiële uitspraak, maar ik ben het ermee eens dat het vaak verstandiger is om iets te gebruiken waardoor je dingen ongedaan kunt maken. - Oli♦
Het pakket trash-cli doet hetzelfde gvfs-trash zonder de afhankelijkheid van gvfs. - Flimm
Ik heb het in het antwoord bewerkt, probeer de volgende keer de bewerking zelf uit te voeren. - don.joey
@ don.joey Dit antwoord lijkt te zeggen find . -name "*.bak" -type f laat zien wat trash *.bak verwijdert. Is dat echt wat je bedoelt? U kunt mappen naar de prullenbak verplaatsen met trash of gvfs-trash, maar trash *.bak verplaatst alleen bestanden en mappen waarvan de naam eindigt .bak en dat bevindt zich onmiddellijk in de huidige map. De schaal wordt groter *.bak, dus trash *.bak heeft geen invloed op .bak bestanden in submappen die zelf geen naam hebben .bak. - Eliah Kagan
@ don.joey Ja ls *.bak (wat ik denk dat je bedoelt) somt op wat trash *.bak trashes. find . -name '*.bak' -xtype f -exec trash {} + gooit alles weg .bak bestanden overal onder .. Het kan geen alias gebruiken, dus installeer trash-cli of schrijf gvfs-trash in plaats daarvan. Hier is een voorbeeld.  -xtype f selecteert bestanden en symlinks naar bestanden, maar geen mappen. Verwijderen .bak  mappen gebruik ook find . -name '*.bak' -execdir trash {} +, wat vermijdt cannot trash non existent fouten voor .bak bestanden binnen .bak directories. Voel je vrij om dit in je antwoord te gebruiken. - Eliah Kagan


Als u alle bestanden van een bepaald type wilt verwijderen, maar slechts één map "diep" uit de huidige map:

find . -maxdepth 2 -name "*.log" -type f -delete

-maxdepth 2 omdat de huidige map "."telt als de eerste map.


3
2017-11-26 17:21





Als je in een git repo zit, kun je gebruiken:

git clean -fdx

Hiermee verwijdert u niet-traceerde bestanden en bestanden in .gitignore.


0
2017-08-09 07:38