So entfernen Sie Ordner mit einem bestimmten Namen

138

Wie entferne ich unter 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 genannten Ordner entfernen a.

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 soll ich aus dem übergeordneten Ordner verwenden?

Joe
quelle
Vielleicht fehlt der Punkt, aber vielleicht hilft es jemandem: Ich habe 410 Ordner in einem Hauptordner - jeder der 410 mit zwei Unterordnern. Alle ersten Unterordner heißen 'final' und enthalten bearbeitete PDFs und eine Word-Inhaltsliste. Alle zweiten Unterordner mit dem Namen tif_pdf_various_names enthalten ursprünglich gescannte, in TIFF-Dateien gespeicherte Dateien (bis zu 200 Seiten), ihre nicht bearbeiteten PDFs und einen Entwurf einer DOCX-Inhaltsliste - also eine Sammlung von Heimarbeiten. Ich musste eine Sammlung der 410 Ordner erstellen, die nur das endgültig bearbeitete Material enthielten - mit den Tiffs nahe 4 TB. Einfachste Methode gefunden wurde , zu verwenden (in MICR
Jurie

Antworten:

155

Wenn das Zielverzeichnis leer ist, verwenden Sie find, filtern Sie nur mit Verzeichnissen, filtern Sie nach Namen und führen Sie rmdir aus:

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

Wenn Sie den Inhalt rekursiv löschen möchten, ersetzen Sie ihn -exec rmdir {} \;durch -deleteoder -prune -exec rm -rf {} \;. Andere Antworten enthalten Details zu diesen Versionen.

Pistache
quelle
9
Könnten Sie bitte erklären, was {} \;tut?
Winklerrr
6
{}kann als "für jede passende Datei / jeden passenden Ordner" gelesen werden - dh es ersetzt jede "gefundene" Datei / jeden gefundenen Ordner. \;ist ein Terminator für die -execKlausel.
wmorrison365
2
Dies gibt mir einen Fehler "kann nicht löschen", wenn das Verzeichnis nicht leer ist
blindeyes
1
-pruneErwägen Sie , der Antwort ein Flag gemäß dem Vorschlag von @David Grayson hinzuzufügen. Ohne dies findwird weiterhin versucht, den jetzt fehlenden Ordner zu besuchen, und schließlich mit einem Fehlercode beendet, der z. B. einen Docker-Build fehlschlagen kann.
Czyzby
159

Verwenden Sie find for name "a" und führen Sie rm aus, um die nach Ihren Wünschen benannten wie folgt zu entfernen:

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

Testen Sie es zuerst mit ls, um Folgendes aufzulisten:

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

Um sicherzustellen, dass nur Verzeichnisse und keine einfachen Dateien entfernt werden, verwenden Sie das Argument "-type d" (wie in den Kommentaren vorgeschlagen):

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

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

wmorrison365
quelle
4
Sie möchten dort wahrscheinlich einen "-typ d" hinzufügen, falls eine Datei mit demselben Namen übereinstimmt.
Mark Loeser
3
Beachten Sie auch, dass dies so etwas fängt 1/2/a/3/4, was möglicherweise nicht beabsichtigt ist, also +1 für die Empfehlung, zuerst zu testen ...
Twalberg
9
reco echo {}, um es zuerst zu testen, anstattls {}
Charney Kaye
2
Hier geh mein node_modules/.
Saruftw
6
Ich habe verwendet find . -name a -type d -exec rm -rf {} \;und es hat funktioniert, obwohl es find: ‘./subdir/subdir/a’: No such file or directoryfür jedes gelöschte Verzeichnis ausgedruckt wurde .
Pacoverflow
59

Dies funktioniert auch - es werden alle Ordner mit dem Namen "a" und deren Inhalt entfernt:

rm -rf `find -type d -name a`
Arash Fotouhi
quelle
@ Buffalo, wie kommt es? Dieses Defo funktioniert, aber auch die anderen. Wäre überrascht, eine Umgebung zu finden, in der dies funktioniert, aber die anderen geben nicht alle Antworten im Wesentlichen find/rm.
wmorrison365
4
@ wmorrison365, denn wenn Sie dies tun find . -name a -exec rm -rf {} \;, stürzt find ab, wenn es versucht, dieses Verzeichnis zu betreten, um nach weiteren Elementen zu suchen, was zu einem Fehler wie führt find: '1/2/3/a': No such file or directory.
Alex Grönholm
@ Alex Grönholm sicher, aber alle Ordner mit dem Namen 'a' werden trotzdem gelöscht. Wie Sie angeben, kann find anschließend nicht in einen gelöschten 'a'-Ordner schauen, aber das spielt keine Rolle. Der Wunsch, den Inhalt von 'a' für die spätere Verarbeitung vor dem Löschen beizubehalten, ist ein anderer Anwendungsfall als der vom OP angeforderte.
wmorrison365
6
@ wmorrison365 Ja, die Verzeichnisse werden gelöscht, aber ich denke nicht, dass es gut ist, eine Lösung zu empfehlen, bei der der Befehl fehlschlägt (gibt einen Exit-Code ungleich Null zurück).
Alex Grönholm
1
Dies gab mir einen Fehler illegal option --t. Ich musste auch das Verzeichnis übergeben, in dem gesucht werden sollte ( stackoverflow.com/questions/25840713/… ) : rm -rf `find . -type d -name a`.
Steve Harrison
25

fooFühren Sie Folgendes aus, um alle Verzeichnisse mit dem Namen zu löschen :

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

Den anderen Antworten fehlt eine wichtige Sache: die -pruneOption. Ohne -prunelöscht GNU find das Verzeichnis mit dem übereinstimmenden Namen und versucht dann, es erneut zu verwenden, um weitere übereinstimmende Verzeichnisse zu finden. Die -pruneOption weist es an, nicht in ein Verzeichnis zurückzukehren, das den Bedingungen entspricht.

David Grayson
quelle
21

Ich bin hier gelandet, um meine node_modulesOrdner zu löschen, bevor ich eine Sicherungskopie meiner laufenden Arbeiten mit erstellt habe rsync. Eine wichtige Voraussetzung ist, dass der node_modulesOrdner verschachtelt werden kann, sodass Sie die -pruneOption benötigen .

Zuerst habe ich dies ausgeführt, um die zu löschenden Ordner visuell zu überprüfen:

find -type d -name node_modules -prune

Dann habe ich dies ausgeführt, um sie alle zu löschen:

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

Dank Pistache

mpalumbo7
quelle
Ahh, das hat gut funktioniert. Um dies zu etwas zu machen, das Sie mit Leichtigkeit verwenden können, können Sie es als kleines Shellscript speichern: sh #!/bin/bash echo "Found node_modules: "; find -type d -name node_modules -prune; read -r -p "Do you really want to delete all directories? [yes/no] " input; if [ ! $input != "yes" ]; then find -type d -name node_modules -prune -exec rm -rf {} \;; fi
Feirell
11
find ./ -name "FOLDERNAME" | xargs rm -Rf

Sollte den Trick machen. WARNUNG: Wenn Sie versehentlich einen .oder /in xargs rm -RfIhren gesamten Computer pumpen, wird dieser gelöscht, ohne dass die Option besteht, ihn wiederherzustellen. Dies erfordert eine Neuinstallation des Betriebssystems.

Slevin
quelle
2
Oh, nur dieses winzige Risiko. Ist das alles? Haha. Super danke für die Warnung. Ich würde diesen Tippfehler definitiv machen.
TinkerTenorSoftwareGuy
9

Ich hatte mehr als 100 Dateien wie

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

Die obigen Antworten haben bei mir nicht funktioniert

aber der folgende Befehl hat mir geholfen.

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

Ich gab -typeals .so löscht es sowohl Dateien als auch Ordner, die mit beginnenlog-

und rm -rflöscht Ordner rekursiv, auch wenn es Dateien enthält.

wenn Sie nur Ordner wollen

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

Dateien allein

find -type f -name "log-*" -exec rm  -rf {} \;
Thamaraiselvam
quelle
8

Hier ist ein Befehl, der mehrere Antworten kombiniert und sowohl unter Linux als auch unter MacOS funktioniert

rm -rf $(find . -type d -name __pycache__)
marcosfede
quelle
Nur eine, die für mich funktioniert hat, die nicht auch Fehler geworfen hat
Kloar
7

Noch einer:

"-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)
dgrigonis
quelle
3
Diese Antwort funktioniert nur für leere Ordner. -deleteentfernt keine nicht leeren Ordner.
Maninak
Vielen Dank für das Hinzufügen der OSX-Version
schu34
6

Dieser Befehl funktioniert bei mir. Es macht seine Arbeit rekursiv

find . -name "node_modules" -type d -prune -exec rm -rf '{}' +

. - aktueller Ordner

"node_modules" - Ordnername

1nstinct
quelle
-2

finde den Pfad / zu / den / Ordnern -maxdepth 1 -name "my_ *" -Typ d -delete

PickleRick
quelle