Wie verwende ich Terminal, um alle .svn-Ordner rekursiv zu löschen?

56

Welchen Befehl kann ich in das Terminal eingeben, um alle .svnOrdner in einem Ordner (und aus allen Unterverzeichnissen) zu löschen, aber nichts anderes?

Mikey
quelle
Vielleicht könntest du einfach svn export path/to/repo path/to/export/tostattdessen ...
Jonny
Ein Hinweis svn exportist, dass nicht über Dateien kopiert wird, die nicht Teil von svn sind. Ich wollte dies zum Beispiel für eine iOS-Anwendung tun, die Cocoa Pods verwendet, wobei wir den Pods-Ordner nicht festschreiben. Dies wurde dann von der Ausgabe übersprungen. Am Ende habe ich etwas Ähnliches wie Richs Antwort für das verwendet, was ich wollte.
Jackofallcode

Antworten:

120
cd to/dir/where/you/want/to/start
find . -type d -name '.svn' -print -exec rm -rf {} \;
  • Verwenden Sie find, was eine Rekursion bewirkt
  • im aktuellen Verzeichnis.
  • Dateityp ist Verzeichnis
  • Dateiname ist .svn
  • gib aus, was bis zu diesem Punkt gepasst hat (die .svn-Verzeichnisse)
  • Führen Sie den Befehl aus rm -rf (thing found from find). Das {} ist ein Platzhalter für die gefundene Entität
  • das ; Tells Find, dass der Befehl für Exec fertig ist. Da hat die Muschel auch eine Vorstellung von was; ist, müssen Sie es mit \ zu entkommen, damit die Shell nichts Besonderes damit macht, und nur übergibt, um zu finden
Reiche Homolka
quelle
2
Gute Lösung. Während findhat -deletewird es nicht nicht-leere Verzeichnisse löschen. Dieser Ansatz ist sauberer, als z. B. Teile des gesamten Dateipfads abzugleichen.
Daniel Beck
13
Ich würde empfehlen, es ohne das -exec rm -rf {} \;erste Mal auszuführen, um sicherzustellen, dass es nur das findet, was Sie wollen. Ich hatte noch nie ein Problem, bei dem ich versehentlich das Falsche gelöscht habe, weil ich immer zuerst nachschaue.
Rob
2
@ Rob guter Punkt, ich mache normalerweise -exec echo rm -rf {} \; dann das Echo entfernen.
Rich Homolka
Eine andere Möglichkeit, wenn es nicht zu viele gibt, wäre, das Löschen jeder Datei mit-exec rm -ri {} \;
doovers am
4
-exec rm -rf {} +ist wahrscheinlich um ein Vielfaches schneller, da nicht zu viele rmInstanzen gestartet werden müssen. Stattdessen wird die maximale Anzahl von Argumenten (in diesem Fall zu entfernende Verzeichnisse) in einem Aufruf gepackt. Dies ist möglich, weil rmmehrere Argumente akzeptiert werden.
Daniel B