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?
Antworten:
Wenn das Zielverzeichnis leer ist, verwenden Sie find, filtern Sie nur mit Verzeichnissen, filtern Sie nach Namen und führen Sie rmdir aus:
Wenn Sie den Inhalt rekursiv löschen möchten, ersetzen Sie ihn
-exec rmdir {} \;
durch-delete
oder-prune -exec rm -rf {} \;
. Andere Antworten enthalten Details zu diesen Versionen.quelle
{} \;
tut?{}
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-exec
Klausel.-prune
Erwägen Sie , der Antwort ein Flag gemäß dem Vorschlag von @David Grayson hinzuzufügen. Ohne diesfind
wird weiterhin versucht, den jetzt fehlenden Ordner zu besuchen, und schließlich mit einem Fehlercode beendet, der z. B. einen Docker-Build fehlschlagen kann.Verwenden Sie find for name "a" und führen Sie rm aus, um die nach Ihren Wünschen benannten wie folgt zu entfernen:
Testen Sie es zuerst mit ls, um Folgendes aufzulisten:
Um sicherzustellen, dass nur Verzeichnisse und keine einfachen Dateien entfernt werden, verwenden Sie das Argument "-type d" (wie in den Kommentaren vorgeschlagen):
Das "{}" ist eine Ersetzung für jede gefundene Datei "a" - der Befehl exec wird gegen jede durch Ersetzung ausgeführt.
quelle
1/2/a/3/4
, was möglicherweise nicht beabsichtigt ist, also +1 für die Empfehlung, zuerst zu testen ...echo {}
, um es zuerst zu testen, anstattls {}
node_modules/
.find . -name a -type d -exec rm -rf {} \;
und es hat funktioniert, obwohl esfind: ‘./subdir/subdir/a’: No such file or directory
für jedes gelöschte Verzeichnis ausgedruckt wurde .Dies funktioniert auch - es werden alle Ordner mit dem Namen "a" und deren Inhalt entfernt:
quelle
find/rm
.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ührtfind: '1/2/3/a': No such file or directory
.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`
.foo
Führen Sie Folgendes aus, um alle Verzeichnisse mit dem Namen zu löschen :Den anderen Antworten fehlt eine wichtige Sache: die
-prune
Option. Ohne-prune
löscht GNU find das Verzeichnis mit dem übereinstimmenden Namen und versucht dann, es erneut zu verwenden, um weitere übereinstimmende Verzeichnisse zu finden. Die-prune
Option weist es an, nicht in ein Verzeichnis zurückzukehren, das den Bedingungen entspricht.quelle
Ich bin hier gelandet, um meine
node_modules
Ordner zu löschen, bevor ich eine Sicherungskopie meiner laufenden Arbeiten mit erstellt habersync
. Eine wichtige Voraussetzung ist, dass dernode_modules
Ordner verschachtelt werden kann, sodass Sie die-prune
Option benötigen .Zuerst habe ich dies ausgeführt, um die zu löschenden Ordner visuell zu überprüfen:
Dann habe ich dies ausgeführt, um sie alle zu löschen:
Dank Pistache
quelle
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
Sollte den Trick machen. WARNUNG: Wenn Sie versehentlich einen
.
oder/
inxargs rm -Rf
Ihren gesamten Computer pumpen, wird dieser gelöscht, ohne dass die Option besteht, ihn wiederherzustellen. Dies erfordert eine Neuinstallation des Betriebssystems.quelle
Ich hatte mehr als 100 Dateien wie
Die obigen Antworten haben bei mir nicht funktioniert
aber der folgende Befehl hat mir geholfen.
Ich gab
-type
als.
so löscht es sowohl Dateien als auch Ordner, die mit beginnenlog-
und
rm -rf
löscht Ordner rekursiv, auch wenn es Dateien enthält.wenn Sie nur Ordner wollen
Dateien allein
quelle
Hier ist ein Befehl, der mehrere Antworten kombiniert und sowohl unter Linux als auch unter MacOS funktioniert
quelle
Noch einer:
quelle
-delete
entfernt keine nicht leeren Ordner.Dieser Befehl funktioniert bei mir. Es macht seine Arbeit rekursiv
. - aktueller Ordner
"node_modules" - Ordnername
quelle
finde den Pfad / zu / den / Ordnern -maxdepth 1 -name "my_ *" -Typ d -delete
quelle