Befehlszeilentool zum rekursiven Löschen von Ordnern mit einem angegebenen Namen in Windows?

73

Ich möchte jedes "_svn" in jedem Ordner und Unterordner löschen ...

Zum Beispiel

c: \
  proyect1
   _svn
   Bilder
     _svn
     Banner
       _svn
     Tasten
       _svn

Dann laufe ich so etwas wie

rm-recurse c:\proyect1 _svn

Und ich sollte bekommen:

c: \
  proyect1
   Bilder
     Banner
     Tasten

Das Ideale wäre eine winzige eigenständige EXE oder so etwas.

- Vielen Dank, Grant. Sobald ich die Frage gestellt habe, habe ich die SVN- Dokumentation zum SVN-Exportbefehl gesehen, aber ich möchte auch die _vti_ * -Ordner löschen, die Visual Studio erstellt, damit ich auch die forLösung untersuchen kann.

opensas
quelle
Bitte formulieren Sie dies in Form einer Frage um. Bitten Sie um Hilfe bei der Entwicklung eines Tools, oder möchten Sie wissen, ob solche Tools verfügbar sind?
Rob
14
.bat-Dateien lösen nicht alle Windows-Probleme. Manchmal muss man sie zuerst mit Befehlen und Dingen füllen.
Grant

Antworten:

138

Ähnlich wie bei BlackTigerXs "for" wollte ich vorschlagen

for /d /r . %d in (_svn) do @if exist "%d" rd /s/q "%d"

JMD
quelle
3
Ja, da dieses "für" so beschaffen ist, dass es jedem Verzeichniseintrag "_svn" hinzufügt, wenn der Verzeichnisbaum rekursiv ist.
JMD
1
Obwohl dies älter als 2 Jahre ist, hast du mir etwas Neues beigebracht! Vielen Dank.
Ryan Ternier
5
@ DavidKEgghead, ersetzen Sie einfach das '.' (aktuelles Verzeichnis) mit dem Verzeichnis, das Sie durchsuchen möchten. Stellen Sie sicher, dass Sie es in Anführungszeichen setzen, wenn Ihr Ziel Leerzeichen enthält. Sie würden also Folgendes verwenden: for /d /r "D:\Projects" %d in (_svn) do @if exist "%d" rd /s/q "%d" Ich teste diese häufig, indem ich zuerst die eigentliche "Arbeit" durch ein Echo ersetze for /d /r "D:\Projects" %d in (_svn) do @if exist "%d" echo "%d", damit ich sehen kann, welche Dinge ich beeinflussen werde.
JMD
2
Wenn ich dies rekursiv ausführe, erhalte ich manchmal "das Verzeichnis ist nicht leer". Warum? Was könnte der Grund dafür sein?
SabareeshSS
5
Wenn Sie dies in einer Bat-Datei speichern möchten, vergessen Sie nicht,% durch %% zu ersetzen.
Jesper Mygind
32

Zeit, etwas PowerShell zu lernen ; o)

Get-ChildItem -path c:\projet -Include '_svn' -Recurse -force | Remove-Item -force -Recurse

Der erste Teil findet jeden _svn-Ordner rekursiv. Force wird verwendet, um versteckte Ordner zu finden. Der zweite Teil wird verwendet, um diese Ordner und ihren Inhalt zu löschen. Das Commandlet zum Entfernen enthält einen praktischen "whatif" -Parameter, mit dem Sie eine Vorschau der Vorgänge anzeigen können.

PowerShell ist für Windows XP und Windows Vista verfügbar. Es ist standardmäßig unter Windows 7 und Windows Server 2008 R2 vorhanden.

Es ist ein MS-Produkt, es ist kostenlos und es rockt!

Cédric Rup
quelle
Diese Lösung funktioniert perfekt unter Windows Server 2008 R2. Vielen Dank
STT LCU
Kennt jemand die Syntax für den Parameter "whatif", um eine Vorschau der Vorgänge anzuzeigen?
Alias ​​51
Fügen Sie einfach "-whatif" am Ende der Zeile hinzu. Es ist eine Option des Remove-Item Cmdlet
Cédric Rup
22

Zum Einfügen / Aufrufen aus einer BATCH-Datei verwenden Sie (z. B. zum Entfernen des Debug- und Release-Ordners):

for /d /r . %%d in (Debug Release) do @if exist "%%d" echo "%%d" && rd /s/q "%%d"

In %einer Batch-Datei sind double erforderlich, um als Escape-Zeichen zu fungieren. Andernfalls wird ein Syntaxfehler gemeldet.

Vielen Dank.

Rajesh Gautam PhD
quelle
14
for /f "usebackq" %d in (`"dir _svn /ad/b/s"`) do rd /s/q "%d"

http://ebersys.blogspot.com/2008/07/recursively-delete-svn-folders-easy-way.html

BlackTigerX
quelle
Ich erhalte eine Fehlermeldung:
Verzeichnisdatei
Hoppla, ich habe die Seite überprüft, auf die Sie verlinkt haben, scheint dort zu sein, wo ein paar ´´ (einfache Anführungszeichen) fehlen ... eine Korrektur, die auch den Trick getan hat ...
öffnet
10

In Windows? Wenn Sie tortoiseSVN verwenden, können Sie mit dem Befehl export eine Kopie des Projekts ohne die Ordner .svn / _svn exportieren.

Gewähren
quelle
1
Sie können den SVN-Export auch mit dem Befehlszeilentool ausführen, unabhängig davon, ob Sie unter Windows arbeiten oder nicht.
Parappa
Ich denke, der Grund, warum Benutzer die .svn / _svn-Ordner rekursiv löschen müssen, ist, dass sie ihre lokale Arbeitskopie direkt an einen neuen Speicherort kopiert haben, um einen Ordnervergleich ihrer geänderten Version im Vergleich zu einem sauberen Export durchzuführen, d. H. nachdem etwas mit der geänderten lokalen Arbeitskopie schief gegangen ist. (Zumindest habe ich es deshalb gebraucht. Es ist definitiv einfacher / schneller, nur 'svn export' zu verwenden, wenn das möglich ist.)
JMD
4
import os
import shutil

curdir = os.path.abspath(os.path.dirname(__file__))

def removedir(dirname, name = ".svn"):
    if os.path.isdir(dirname):
        for file in os.listdir(dirname):
            if os.path.isdir(os.path.join(dirname, file)) and file == name:
                thedir = os.path.join(dirname, name)
                shutil.rmtree(thedir)
                print ".",
            else:
                removedir(os.path.join(dirname, file))

Ich denke, Sie können dieses Python-Skript ausprobieren, das unter jedem Betriebssystem funktioniert, wenn Sie Python installiert haben.

Zhu Tao
quelle
3

Hier ... mit FreeCommander oder TotalCommander

http://www.broobles.com/blog/posts/36

socendani


quelle
1
Als langjähriger Benutzer von TotalCommander (ehemals Windows Commander!) Kann ich diese Antwort nicht negativ bleiben lassen. Dies ist eine großartige, einfache Lösung für jemanden, auf dem TC bereits installiert ist. Ich bin froh, diesen raffinierten Trick gelernt zu haben. Vielen Dank!
Adam Tuttle
1
Die einfachste Lösung hier!
Amio.io
3

Eine weitere Option aus dem SVN-Forum : Verwenden Sie XCopy mit einer Datei, die die Liste der auszuschließenden Dateien / Verzeichnisse enthält (in diesem Fall .svn oder _svn).

XCopy C:\VersionedFolder C:\UnVersionedFolder /EXCLUDE:C:\No.SVN.txt /E /C /I /F /R /Y
Teorist
quelle
1
Oder für ROBOCOPYdie keine Listendatei erforderlich ist.
KayleeFrye_onDeck