Ich gebe den folgenden Befehl aus, um die .svn-Verzeichnisse zu finden:
find . -name ".svn"
Das gibt mir folgende Ergebnisse:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
Wie könnte ich all diese Zeilen verarbeiten rm -fr
, um die Verzeichnisse und deren Inhalt zu löschen?
find
rm
subversion
Arnaud
quelle
quelle
-delete
Option.-exec rm -r "{}" \;
das Ende des Funds ergänzen - seien Sie vorsichtig bei der Verwendungrm -r
! :)-name ".svn"
es nur mit dem.svn
Verzeichnis selbst und nicht mit den Dateien im.svn
Verzeichnis übereinstimmt .-exec
mit Anführungszeichen"{}"
).Antworten:
Find kann Argumente mit der
-exec
Option für jede gefundene Übereinstimmung ausführen . Dies ist ein empfohlener Mechanismus, da Sie Pfade mit Leerzeichen / Zeilenumbrüchen und anderen Zeichen korrekt behandeln können. Sie müssen den Inhalt des Verzeichnisses löschen, bevor Sie das Verzeichnis selbst entfernen können. Verwenden Sie hierzu-r
denrm
Befehl.Für Ihr Beispiel können Sie Folgendes ausgeben:
Sie können find auch anweisen , nur Verzeichnisse mit dem Namen .svn zu finden, indem Sie einen Haken setzen
-type d
:Warnung Verwenden Sie
rm -r
mit Vorsicht löscht den Ordner und seinen Inhalt.Wenn Sie nur leere Verzeichnisse sowie Verzeichnisse löschen möchten, die nur leere Verzeichnisse enthalten, können Sie dies mit
-delete
und tun-empty
:quelle
-type
nachdem-name
in Fund Befehlen, da Anrufe anstat
die Art zu erhalten teuer sind. Ich habe es nur selbst mit einer ziemlich großen Anzahl von Dateien versucht, und es scheint wahr zu sein: Das Ausführenfind . -name 'foo' -type d
dauerte 19 Sekunden, während esfind . -type d -name 'foo'
32 Sekunden dauerte. Also ca. 50% längere Zeit zum-type
ersten Mal laufen .find
, dass in diesem Ordner nach anderen Übereinstimmungen gesucht werden soll , während gleichzeitig der Ordner entfernt wird. ~ Ich weiß noch nicht, wie ich das beheben soll. ~ Dirty Fix:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
-depth
Argument behebt dies:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
Hier ist ein tragbarer noch schneller als der akzeptierte Antwortweg.
Die Verwendung eines
+
anstelle eines Semikolons alsfind
Befehlsabschlusszeichen optimiert die CPU-Auslastung. Das kann von Bedeutung sein, wenn Sie viele.svn
Unterverzeichnisse haben:Beachten Sie auch , dass Sie nie ein Bedürfnis hier die geschweiften Klammern zitieren.
1 Es sei denn, Sie verwenden die
fish
Shell.quelle
+
ist die CPU - Auslastung zu reduzieren, verwenden;
nicht zu lang Fehler auf einen Befehl führen.Angenommen, Sie verwenden gnu find , können Sie die folgende
-delete
Option verwenden:das ist leichter zu merken.
quelle
Auf meinem Computer, wenn ich Folgendes verwende:
Die Verzeichnisse werden gelöscht, aber ich erhalte den Fehler:
für jedes Verzeichnis.
Meine Verzeichnisse sind nicht leer, daher funktioniert die Option -delete bei mir nicht. Den Grund für dieses Verhalten habe ich hier gefunden :
Ich habe dies stattdessen verwendet, um Folgendes zu umgehen:
Denken Sie daran, dass find weiterhin versucht, in Verzeichnisse mit dem Namen dirname zurückzukehren, was nicht unbedingt erforderlich ist und einige Zeit in Anspruch nimmt. Abhängig von Ihrer Verzeichnisstruktur können Sie dies möglicherweise mit der
--depth
Suchoption umgehen. Wenn Sie eine Verzeichnisstruktur wie dirname / foo / dirname haben, erhalten Sie außerdem die Fehlermeldung "Keine solchen Dateien oder Verzeichnisse" von rm. Um die Fehler zu unterdrücken, können Sie stderr nach / dev / null umleiten oder das-f
Flag (force) mit rm verwenden.quelle
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
ist eine ausfallsichere Version, die nicht auf Leerzeichen abstürzt-prune
.-prune
, um den Fehler "Keine solche Datei oder Verzeichnis" zu vermeiden.Ein schnellerer Weg, dies zu tun, ist:
Falls Sie ".svn" in einer anderen ".svn" haben.
quelle
Bash-spezifische Lösung:
quelle
bash: /bin/rm: Argument list too long
Ich habe festgestellt, dass die
-delete
Aktion mit dem-path
Test gut funktioniert . Zum Beispiel sollte das folgende Problem mit den Originalplakaten gelöst werden:quelle
-delete
impliziert-depth
, und es löscht sicher nicht leere Verzeichnisse auf meinem System.