Eine der Aufgaben eines Exporttools, das ich in meiner Anwendung habe, besteht darin, alle .svn
Verzeichnisse aus meinem Anwendungsverzeichnisbaum zu bereinigen . Ich suche nach einem rekursiven Befehl in der Linux-Shell, der den gesamten Baum durchläuft und die .svn
Dateien 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 ...
Antworten:
Versuche dies:
Bevor ich einen solchen Befehl ausführe, möchte ich oft zuerst diesen ausführen:
quelle
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
tun?ls
erhalte ichentries prop-base props text-base tmp
Ausgabe ...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:xargs
ist intelligent genug, dass es nur so viele Argumente weitergibt,rm
wie es akzeptieren kann. Wenn Sie also eine Million Dateien hatten, wurde diese möglicherweiserm
1.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:
In den ersten beiden
-exec
Formularen wirdrm
jeder Ordner gelöscht. Wenn Sie also 1.000.000 Ordner haben, wirdrm
dieser 1.000.000 Mal aufgerufen. Das ist sicherlich weniger als ideal. Neuere Implementierungen vonrm
ermöglichen es Ihnen, den Befehl mit einer+
Angabe abzuschließen, dierm
so viele Argumente wie möglich akzeptiert:Die letzte find / xargs-Version verwendet print0, wodurch find eine Ausgabe generiert, die
\0
als Terminator und nicht als Zeilenumbruch verwendet wird. Da POSIX-Systeme nur Zeichen\0
im Dateinamen zulassen , ist dies der sicherste Weg, um sicherzustellen, dass die Argumente korrekt anrm
die Anwendung übergeben werden oder die Anwendung ausgeführt wird.Darüber hinaus gibt es eine
-execdir
, dierm
aus dem Verzeichnis ausgeführt wird, in dem die Datei gefunden wurde, und nicht aus dem Basisverzeichnis, und eine-depth
, die zuerst die Tiefe startet.quelle
Keine Notwendigkeit für Pipes, Xargs, Exec oder irgendetwas:
Bearbeiten: Nur ein Scherz,
-delete
ruft offensichtlichunlinkat()
unter der Haube auf, so dass es sich wieunlink
oder verhältrmdir
und sich weigert, Verzeichnisse mit Dateien zu bearbeiten .quelle
-delete
dass ein Verzeichnis nicht berührt wird, wenn es Dateien enthält.-force
oder rekursives Flag für-delete
Prädikat, daher ist diese Antwort nutzlos. Somit ist es zurück zu|xargs rm -rf
, was weniger hässlich zu tippen ist als-exec
mit seinen hässlichen Platzhaltern und dem Semikolon :-exec rm -rf '{}' \;
.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:
quelle
Wenn Sie nicht viel sehen möchten
Warnungen, dann verwenden Sie den
-depth
Schalter:quelle
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.
quelle
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
-print0
wird sichergestellt, dass das Skript Pfade mit Leerzeichen verarbeiten kann:quelle
quelle
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
Infolgedessen können Sie den Befehl find wie folgt verwenden:
quelle
Versuche dies:
Weitere Informationen zum Befehl find finden Sie unter developerWorks .
quelle
Wenn Sie eine Kopie exportieren möchten, ohne die Arbeitskopie zu ändern, können Sie alternativ rsync verwenden:
quelle