2012-10-23 12 views
54

Wie entferne ich in Linux Ordner mit einem bestimmten Namen, die tief in einer Ordnerhierarchie verschachtelt sind? Die folgenden Pfade befinden sich unter einem Ordner und ich möchte alle Ordner entfernen, die a genannt werden.So entfernen Sie Ordner mit einem bestimmten Namen

1/2/3/a 
1/2/3/b 
10/20/30/a 
10/20/30/b 
100/200/300/a 
100/200/300/b 

Welchen Linux-Befehl sollte ich aus dem übergeordneten Ordner verwenden?

Antwort

67

Wenn das Zielverzeichnis leer ist, Verwendung finden, Filter mit nur Verzeichnisse, Filter mit Namen, führen rmdir:

find -type d -name a -exec rmdir {} \; 

Wenn Sie seinen Inhalt rekursiv löschen, ersetzen -exec rmdir {} \; durch -delete oder -prune -exec rm -rf {} \;. Andere Antworten enthalten Details über diese Versionen, kreditieren sie auch.

79

Verwenden Namen finden "a" und führen Sie rm diejenigen nach Ihren Wünschen Namen zu entfernen, wie folgt:

find . -name a -exec rm -rf {} \; 

-Test zunächst ls mit der Liste hinzu:

find . -name a -exec ls {} \; 

Um sicherzustellen, dies löscht nur Verzeichnisse und nicht die normalen Dateien, die „-Typ d“ arg verwenden (wie in den Kommentaren vorgeschlagen):

find . -name a -type d -exec rm -rf {} \; 

Die "{}" ist eine Ersetzung für jede gefundene Datei "a" - der exec-Befehl wird gegen jede durch Substitution ausgeführt.

+2

Sie wahrscheinlich eine "-Typ d" hinzufügen möchten nur dort, wo eine Datei den gleichen Namen hat. –

+1

Beachten Sie auch, dass dies etwas wie "1/2/a/3/4" fängt, was nicht beabsichtigt ist, also +1 für die Empfehlung, zuerst zu testen ... – twalberg

+2

reco 'echo {}', um es zuerst zu testen , anstelle von 'ls {}' – charneykaye

10
find ./ -name "FOLDERNAME" | xargs rm -Rf 

Sollte der Trick tun. WARNUNG: Wenn Sie versehentlich . oder / in xargs rm -Rf pumpen, wird Ihr gesamter Computer gelöscht, ohne dass eine Option zur Wiederherstellung des Betriebssystems erforderlich ist.

+0

Dieser arbeitet für mich, thx! – DarkteK

+0

Oh, nur das winzige Risiko. Ist das alles? Haha. Super Danke für die Warnung. Ich würde definitiv einen Tippfehler machen. – TinkerTenorSoftwareGuy

21

Dies funktioniert auch - es alle Ordner „a“ und deren Inhalte genannt entfernen wird:

rm -rf `find -type d -name a` 
+4

Dies ist der einzige, der tatsächlich funktioniert. – Buffalo

+0

@Buffalo, wie kommt es? Dieser Defo funktioniert, aber auch die anderen. Wäre überrascht, ein env zu finden, wo das funktioniert, aber die anderen geben nicht alle Antworten sind im Wesentlichen 'find/rm'. – wmorrison365

+2

@ wmorrison365 weil, wenn Sie 'finden. -name a -exec rm -rf {} \; ', find wird abstürzen, wenn es versucht, in dieses Verzeichnis zu gehen, um nach weiteren Elementen zu suchen, was zu einem Fehler wie' find: '1/2/3/a' führt: Nein Datei oder Verzeichnis ". –

6

Ich hatte mehr als 100 Dateien wie

log-12 
log-123 
log-34 
.... 

oben Antworten für mich nicht funktioniert hat

aber folgender Befehl half mir.

find . -name "log-*" -exec rm -rf {} \; 

i gab -type als . so dass es beide Dateien und Ordner löscht, die mit beginnt log-

und rm -rf Ordner löscht rekursiv sogar Dateien.

wenn Sie Ordner allein

find -type d -name "log-*" -exec rm -rf {} \; 

Dateien allein

find -type f -name "log-*" -exec rm -rf {} \; 
6

Um alle Verzeichnisse mit dem foo Namen zu löschen, führen Sie:

find -type d -name foo -a -prune -exec rm -rf {} \; 

Die anderen Antworten eine wichtige fehlen Ding: die -prune Option. Ohne -prune löscht GNU find das Verzeichnis mit dem passenden Namen und versucht dann, in das Verzeichnis zu suchen, um weitere übereinstimmende Verzeichnisse zu finden. Die Option -prune weist darauf hin, dass sie nicht in ein Verzeichnis rekurriert, das den Bedingungen entspricht.

1

Ein anderes:

"-exec rm -rf {} \;" can be replaced by "-delete" 

find -type d -name __pycache__ -delete  # GNU find 
find . -type d -name __pycache__ -delete # POSIX find (e.g. Mac OS X) 
0

find path/to/die/Ordner -maxdepth 1 -name "my_ *" -Typ d -delete

Verwandte Themen