So entfernen Sie alle .svn-Verzeichnisse aus meinen Anwendungsverzeichnissen

192

Eine der Aufgaben eines Exporttools, das ich in meiner Anwendung habe, besteht darin, alle .svnVerzeichnisse aus meinem Anwendungsverzeichnisbaum zu bereinigen . Ich suche nach einem rekursiven Befehl in der Linux-Shell, der den gesamten Baum durchläuft und die .svnDateien löscht .

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

find . -name .svn | rm -fr

Es hat nicht funktioniert ...

Itay Moav-Malimovka
quelle
3
Ihr Befehl sollte funktionieren, wenn Sie 'xargs rm -rf' verwenden
Peter van der Heijden
1
Möglicherweise möchten Sie auch den Löschbefehl "rm -rfi" ändern, um sicherzustellen, dass Sie sicher sind, dass Sie die Verzeichnisse löschen möchten.
Bedwyr
Verwenden Sie jedoch keine xargs. Sie haben Probleme mit Verzeichnissen, in denen Leerzeichen usw. enthalten sind. Verwenden Sie find wie unten beschrieben.
John Hunt

Antworten:

438

Versuche dies:

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

Bevor ich einen solchen Befehl ausführe, möchte ich oft zuerst diesen ausführen:

find . -name .svn -exec ls '{}' \;
Greg
quelle
43
Möglicherweise müssen Sie {} in einfache Anführungszeichen setzen, wenn in Verzeichnissen Leerzeichen oder solche Zeichen vorhanden sind: find . -name .svn -exec rm -rf '{}' \;
mtoloo
38
Dieser Test funktioniert besser in meiner Bash:find . -name .svn -exec echo {} \;
Fedir RYKHTIK
6
Das erste Ausführen von echo / ls ist der 'Pro'-Touch für diese Antwort. Jeder Dummkopf kann ein System zerstören.
John Hunt
6
Was bedeutet das {} \;tun?
Jon Mitten
3
Durch Ausführen des zweiten Befehls einschließlich lserhalte ich entries prop-base props text-base tmpAusgabe ...
Rasoul
51

Was Sie geschrieben haben, sendet eine Liste von durch Zeilenumbrüche getrennten Dateinamen (und Pfaden) an rm, aber rm weiß nicht, was mit dieser Eingabe zu tun ist. Es werden nur Befehlszeilenparameter erwartet.

xargs Nimmt Eingaben entgegen, die normalerweise durch Zeilenumbrüche getrennt sind, und platziert sie in der Befehlszeile. Wenn Sie also xargs hinzufügen, funktioniert das, was Sie hatten:

find . -name .svn | xargs rm -fr

xargsist intelligent genug, dass es nur so viele Argumente weitergibt, rmwie es akzeptieren kann. Wenn Sie also eine Million Dateien hatten, wurde diese möglicherweise rm1.000.000 / 65.000 Mal ausgeführt (wenn Ihre Shell 65.002 Argumente in der Befehlszeile akzeptieren konnte {65.000 Dateien + 1 für rm + 1 für -fr}).

Wie Personen zutreffend hervorgehoben haben, funktionieren auch die folgenden:

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

In den ersten beiden -execFormularen wird rmjeder Ordner gelöscht. Wenn Sie also 1.000.000 Ordner haben, wird rmdieser 1.000.000 Mal aufgerufen. Das ist sicherlich weniger als ideal. Neuere Implementierungen von rmermöglichen es Ihnen, den Befehl mit einer +Angabe abzuschließen, die rmso viele Argumente wie möglich akzeptiert:

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

Die letzte find / xargs-Version verwendet print0, wodurch find eine Ausgabe generiert, die \0als Terminator und nicht als Zeilenumbruch verwendet wird. Da POSIX-Systeme nur Zeichen \0im Dateinamen zulassen , ist dies der sicherste Weg, um sicherzustellen, dass die Argumente korrekt an rmdie Anwendung übergeben werden oder die Anwendung ausgeführt wird.

Darüber hinaus gibt es eine -execdir, die rmaus dem Verzeichnis ausgeführt wird, in dem die Datei gefunden wurde, und nicht aus dem Basisverzeichnis, und eine -depth, die zuerst die Tiefe startet.

Kaleb Pederson
quelle
31

Keine Notwendigkeit für Pipes, Xargs, Exec oder irgendetwas:

find . -name .svn -delete

Bearbeiten: Nur ein Scherz, -deleteruft offensichtlich unlinkat()unter der Haube auf, so dass es sich wie unlinkoder verhält rmdirund sich weigert, Verzeichnisse mit Dateien zu bearbeiten .

AB
quelle
54
Ein Problem ist, -deletedass ein Verzeichnis nicht berührt wird, wenn es Dateien enthält.
Xeoncross
2
Es gibt kein -forceoder rekursives Flag für -deletePrädikat, daher ist diese Antwort nutzlos. Somit ist es zurück zu |xargs rm -rf, was weniger hässlich zu tippen ist als -execmit seinen hässlichen Platzhaltern und dem Semikolon : -exec rm -rf '{}' \;.
Tomasz Gandor
13

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 anstelle einer Kasse durchführen:

svn export <url>
Mnementh
quelle
+1, es ist nicht nötig, dies zu wiederholen, wenn es bereits in svn integriert ist.
Powerlord
1
Das einzige Problem, das ich bei diesem Ansatz sehe, ist, wenn Sie nicht versionierte Dateien beim Export beibehalten möchten. In den SVN-Dokumenten heißt es: "Alle lokalen Änderungen bleiben erhalten, Dateien, die nicht der Versionskontrolle unterliegen, werden jedoch nicht kopiert."
Raidfive
@raidfive: Normalerweise bevorzuge ich es, alle relevanten Dateien unter Versionskontrolle zu haben, auch verwendete Bibliotheken, damit 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
aber ... ich brauchte eine allgemeinere Antwort. Die .svn war nur das häufigste Beispiel, das habe ich in der Frage bemerkt.
Itay Moav-Malimovka
12

Wenn Sie nicht viel sehen möchten

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

Warnungen, dann verwenden Sie den -depthSchalter:

find . -depth -name .svn -exec rm -fr {} \;
faul1
quelle
10

In Windows können Sie das folgende Registrierungsskript verwenden, um Ihrem Kontextmenü mit der rechten Maustaste "SVN-Ordner löschen" hinzuzufügen. Führen Sie es in einem beliebigen Verzeichnis aus, das diese lästigen Dateien enthält.

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\" \""
Nathan Taylor
quelle
Ordentlicher Trick. Nicht hilfreich für das OP, aber +1, weil ich beeindruckt war!
rrhartjr
das ist fantastisch. Vielen Dank. Ich weiß, das ist super alt, aber was auch immer. Ich liebe es trotzdem.
Anthony
9

Du hattest es fast. Wenn Sie die Ausgabe eines Befehls als Parameter an einen anderen übergeben möchten, müssen Sie xargs verwenden. Durch Hinzufügen -print0wird sichergestellt, dass das Skript Pfade mit Leerzeichen verarbeiten kann:

find . -type d -name .svn -print0|xargs -0 rm -rf
Soulmerge
quelle
2
für einige Resonanz war das, was schließlich funktionierte, zu finden. -name .svn | xargs rm -rf Ihre Version gab mir die Richtung, danke
Itay Moav -Malimovka
4
find . -name .svn |xargs rm -rf
Itay Moav-Malimovka
quelle
4

Als wichtiges Problem, wenn Sie die Shell zum Löschen von .svn-Ordnern verwenden möchten, benötigen Sie das Argument -depth , um zu verhindern, dass der Befehl find in das gerade gelöschte Verzeichnis gelangt und Fehlermeldungen wie z

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

Infolgedessen können Sie den Befehl find wie folgt verwenden:

cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;
fatihk
quelle
Dies ist, was ich gesucht habe und sollte die richtige Antwort sein.
Luckytaxi
3

Versuche dies:

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

Weitere Informationen zum Befehl find finden Sie unter developerWorks .

Edward Dale
quelle
2

Wenn Sie eine Kopie exportieren möchten, ohne die Arbeitskopie zu ändern, können Sie alternativ rsync verwenden:

rsync -a --exclude .svn path/to/working/copy path/to/export
pimlottc
quelle
1
Oder verwenden Sie svn export / path / to / repository, das im Wesentlichen dasselbe tut.
Kaleb Pederson
Der Autor sagte ausdrücklich, er wolle svn nicht verwenden; Vielleicht ist in seiner Zielumgebung kein SVN installiert.
Pimlottc