2009-08-18 17 views
177

Eine der Aufgaben eines Export-Tool, das ich in meiner Anwendung habe, ist alle .svn Verzeichnisse aus meiner Anwendung Verzeichnisbaum zu reinigen. Ich suche nach einem rekursiven Befehl in der Linux-Shell, die den gesamten Baum durchläuft und die .svn-Dateien löscht.So entfernen Sie alle SVN-Verzeichnisse aus meinen Anwendungsverzeichnissen

Ich verwende keinen Export, da dieses Skript für einige andere Datei-/Verzeichnisnamen verwendet wird, die nicht mit SVN zusammenhängen. Ich habe versucht, so etwas wie:

find . -name .svn | rm -fr 

Es hat nicht funktioniert ...

+3

Ihr Befehl sollte funktionieren, wenn Sie ‚xargs rm -rf‘ verwenden –

+1

Sie auch den Löschbefehl „rm wollen könnte ändern -rfi "nur um sicherzustellen, dass Sie positiv sind, möchten Sie die Verzeichnisse löschen. – bedwyr

+0

Verwenden Sie nicht xargs though .. Sie werden Probleme mit Verzeichnissen haben, die Leerzeichen in ihnen haben usw. Verwenden Sie find wie unten beschrieben. –

Antwort

408

Versuchen Sie folgendes:

find . -name .svn -exec rm -rf '{}' \; 

Bevor Sie einen Befehl wie das Laufen, Ich mag zu oft laufen diese zuerst:

find . -name .svn -exec ls '{}' \; 
+43

Sie müssen möglicherweise {} in Anführungszeichen setzen, wenn Platz oder solche Zeichen in Verzeichnissen sein können: 'finden. -name .svn -exec rm -rf '{}' \; ' – mtoloo

+36

Dieser Test funktioniert besser in meinem bash:' finden. -name .svn -exec echo {} \; ' –

+4

Das Ausführen von echo/ls ist der erste Schritt zu dieser Antwort. Jeder Narr kann ein System zerstören. –

9

Sie es fast hatte. Wenn Sie die Ausgabe eines Befehls als Parameter an einen anderen übergeben möchten, müssen Sie xargs verwenden. Hinzufügen -print0 stellt sicher, dass das Skript Pfade mit Leerzeichen umgehen kann:

find . -type d -name .svn -print0|xargs -0 rm -rf 
+2

für etwas reson was funktionierte, war zu finden. -name .svn | xargs rm -rf Ihre Version gab mir die Richtung, aber danke –

+0

dies funktioniert in Fisch Shell unter osx – mcuadros

3

Try this:

find . -name .svn -exec rm -v {} \; 

Lesen Sie mehr über den Befehl find bei developerWorks.

11

Wenn Sie nicht gerne viel

sehen
find: `./.svn': No such file or directory 

Warnungen, dann verwenden Sie den -depth Schalter:

find . -depth -name .svn -exec rm -fr {} \; 
4
find . -name .svn |xargs rm -rf 
2

Alternativ, wenn Sie eine Kopie exportieren möchten, ohne dass die Arbeitskopie zu ändern, können Sie rsync verwenden:

rsync -a --exclude .svn path/to/working/copy path/to/export 
+1

Oder benutze svn export/pfad/zu/repository, was im Prinzip dasselbe tut. –

+0

Der Autor sagte ausdrücklich, dass er nicht svn verwenden wollte; vielleicht hat seine Zielumgebung Svn nicht installiert. – pimlottc

50

Was Sie geschrieben sendet eine Liste von Newline Dateinamen getrennt (und Pfade) zu rm, aber rm weiß nicht, was mit diesem Eingang zu tun ist. Es erwartet nur Kommandozeilenparameter.

xargs nimmt die Eingabe, in der Regel durch Zeilenumbrüche getrennt sind, und legt sie auf der Kommandozeile, macht so das Hinzufügen xargs, was Sie zur Arbeit hatte:

find . -name .svn | xargs rm -fr 

xargs intelligent genug, dass es nur so viele Argumente übergeben werden rm wie es akzeptieren kann. Wenn Sie also eine Million Dateien haben, könnte es rm 1.000.000/65.000 Mal ausgeführt werden (wenn Ihre Shell 65.002 Argumente in der Befehlszeile akzeptieren könnte {65k Dateien + 1 für RM + 1 für -fr}).

Als Personen adeptly haben darauf hingewiesen, folgendes auch arbeiten:

find . -name .svn -exec rm -rf {} \; 
find . -depth -name .svn -exec rm -fr {} \; 
find . -type d -name .svn -print0|xargs -0 rm -rf 

Die ersten beiden -exec Formen rufen beide rm für jeden Ordner gelöscht werden, wenn Sie also 1.000.000 Ordner hätten, würden rm 1.000.000 mal aufgerufen .Dies ist sicherlich nicht ideal. Neuere Implementierungen von rm können Sie den Befehl zu dem Schluss, mit einem + darauf hinweist, dass rm so viele Argumente wie möglich annehmen:

find . -name .svn -exec rm -rf {} + 

Der letzte Fund/xargs Version verwendet print0, die finden Ausgabe erzeugen macht die \0 als verwendet Terminator statt einer Newline. Da POSIX-Systeme jedes Zeichen außer \0 im Dateinamen zulassen, ist dies der sicherste Weg, um sicherzustellen, dass die Argumente korrekt an rm übergeben werden oder die Anwendung ausgeführt wird.

Darüber hinaus gibt es ein -execdir die rm aus dem Verzeichnis ausgeführt wird, in dem die Datei gefunden wurde, anstatt auf dem Basisverzeichnis und ein -depth die Tiefe zuerst beginnen.

+2

Upvote, nur weil Sie Xargs verwenden. – Augusto

9

In Windows können Sie das folgende Registrierungsskript verwenden, um "Delete SVN Folders" zu Ihrem Rechtsklick-Kontextmenü hinzuzufügen. Führen Sie es in einem beliebigen Verzeichnis mit diesen nervtötenden Dateien aus.

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] 
@="Delete SVN Folders" 

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command] 
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \"" 
+0

Ordentlicher Trick. Nicht hilfreich für das OP, aber +1, weil ich beeindruckt war! – rrhartjr

+0

das ist genial. Vielen Dank. Ich weiß, das ist super alt, aber was auch immer. Ich liebe es trotzdem. – Anthony

31

Keine Notwendigkeit für Rohre, xargs, exec, oder irgendetwas:

find . -name .svn -delete 

Edit: Scherz, offenbar -delete Anrufe unlinkat() unter der Haube, so dass es wie unlink oder rmdir verhält und wird sich weigern, auf Verzeichnissen zu arbeiten, die Dateien enthalten.

+0

nett. Vielen Dank. war das '-delete'-Argument nicht bekannt –

+52

Ein Problem, '-delete' wird ein Verzeichnis nicht berühren, wenn es Dateien enthält. – Xeoncross

+2

Es gibt kein '-force' oder rekursives Flag für das Prädikat' -delete', daher ist diese Antwort nutzlos. Daher ist es zurück zu '| xargs rm -rf', was weniger hässlich ist, als' -exec' mit seinen hässlichen Platzhaltern und Semikolon einzugeben: '-exec rm -rf '{}' \;'. –

11

Es gibt bereits viele Antworten zum Löschen des .svn-Verzeichnisses. Aber ich möchte hinzufügen, dass Sie diese Verzeichnisse von Anfang an vermeiden können, wenn Sie einen Export statt einer Kasse zu tun:

svn export <url> 
+0

+1, es gibt keine Notwendigkeit, dies zu wiederholen, wenn es bereits in Svn eingebaut ist. – Powerlord

+1

Das einzige Problem, das ich mit diesem Ansatz sehe, ist, wenn Sie nicht versionierte Dateien im Export behalten wollen. Aus den Svn-Dokumenten: "Alle lokalen Änderungen bleiben erhalten, aber Dateien, die nicht der Versionskontrolle unterliegen, werden nicht kopiert." – raidfive

+0

@raidfive: Normalerweise bevorzuge ich alle relevanten Dateien unter Versionskontrolle, sogar benutzte Bibliotheken, so dass das Projekt sofort funktioniert. Nicht versionierte Dateien in diesem Setup sind kompilierte Binärdateien, die durch ein Ziel in der Builddatei neu erstellt werden. Aber Sie haben Recht, wenn Ihr Projekt auf Dateien basiert, die nicht der Versionskontrolle unterliegen, würde ein Export nicht funktionieren. – Mnementh

4

als ein wichtiges Thema, wenn Sie Shell löschen .svn nutzen wollen Ordner Sie benötigen -depth Argument, um zu verhindern, dass der Befehl find in das gerade gelöschte Verzeichnis eintritt und Fehlermeldungen wie z

"find: ./.svn: No such file or directory" 

Als Ergebnis können, finden Sie Befehl wie unten verwenden:

cd [dir_to_delete_svn_folders] 
find . -depth -name .svn -exec rm -fr {} \; 
+0

Dies ist, was ich suchte und sollte die richtige Antwort sein. – luckytaxi

Verwandte Themen