find . -name test -type d -print0|xargs -0 rm -r --
xargs führt den als Parameter übergebenen Befehl mit den an stdin übergebenen Argumenten aus.
Hiermit werden rm -rdas Verzeichnis und alle untergeordneten Elemente gelöscht.
Das --kennzeichnet das Ende der Argumente, um zu vermeiden, dass ein Pfad, der mit -einem Argument beginnt , als Argument behandelt wird.
-print0sagt find, dass \0Zeichen anstelle von Zeilenumbrüchen gedruckt werden sollen; und -0sagt xargsnur \0als Argument Trennzeichen zu behandeln .
Dies führt dazu, dass rmmehrere Verzeichnisse gleichzeitig aufgerufen werden, wodurch der Aufwand vermieden wird, rmfür jedes Verzeichnis separat aufzurufen .
Alternativ findkönnen Sie auch einen Befehl für jede ausgewählte Datei ausführen :
find . -name test -type d -exec rm -r {} \;
Und dieses mit besserer Leistung, da es rmmit mehreren Verzeichnissen gleichzeitig aufruft :
find . -name test -type d -exec rm -r {} +
(Beachten Sie das +am Ende; dieses entspricht der xargsLösung.)
Entschuldigung, ich habe vergessen zu erwähnen, dass diese Verzeichnisse Dateien haben können. Ich konnte einige von ihnen wegen "find: cannot delete` ./start ': Directory not empty "nicht löschen. Error
garbage collection
@garbagecollection Ich habe ein Update hinzugefügt.
Jaypal Singh
3
Sie können +stattdessen auch \;mehrere Verzeichnisse gleichzeitig übergeben.
jfs
Danke @ JFSebastian Guter Punkt. Ich werde es der Antwort hinzufügen.
Wie eine andere Antwort zeigt, können Sie versuchen, alle Verzeichnisse mit dem Namen zu finden testund zu löschen
find -name "test" -type d -delete
Ich habe auf dem Mac einige Probleme mit der Cross-Kompatibilität festgestellt, daher habe ich diesen entsprechenden Befehl verwendet:
find -path "*/test" -type d -delete
-path : Sucht nach einem Muster im vollqualifizierten Dateinamen.
Wenn sich jedoch in einem der genannten Verzeichnisse testDateien befinden, findwird dies beklagt Directory is not empty, und das Verzeichnis kann nicht entfernt werden.
Wenn Sie beabsichtigen, alle Dateien einschließlich des testVerzeichnisses zu löschen , können Sie mit demselben Trick alle Dateien in den testzuerst genannten Verzeichnissen löschen .
find -path "*/test/*" -delete
Das Muster: "*/test/*"stellt sicher, dass nur Dateien in einem Verzeichnis mit dem Namen gelöscht werden /test/. Sobald die Verzeichnisse leer sind, können wir die Verzeichnisse mit dem ersten Befehl löschen:
find -path "*/test" -type d -delete
Beispiel:
$ tree
.
├── mytest
│ └── test
│ └── blah.txt
├── test
│ ├── bar.jpg
│ └── dir
│ └── bar.bak
└── testdir
└── baz.c
5 directories, 4 files
$ find -path "*/test" -type d -delete
$ tree
.
├── mytest
│ └── test
├── test
└── testdir
└── baz.c
4 directories, 1 file
$ find -name "test" -type d -delete
$ tree
.
├── mytest
└── testdir
└── baz.c
2 directories, 1 file
+
in der Entdeckung. Ich hatte keine Ahnung, wünschte auf jeden Fall, ich hätte das schon vor langer Zeit gewusst.xargs
Befehl funktionierte gut.-name: sucht nach dem übergebenen Namen. Sie können
-regex
Namen basierend auf regulären Ausdrücken angeben-type: Sucht nach Dateitypen.
d
sucht nur nach Verzeichnissen-delete: Aktion, die die gefundene Liste löscht.
Alternative:
Wie JF Sebastian in den Kommentaren feststellte:
Sie können
+
stattdessen auch\;
mehrere Verzeichnisse gleichzeitig übergeben.quelle
+
stattdessen auch\;
mehrere Verzeichnisse gleichzeitig übergeben.Ein weiterer Weg, dies zu tun, ist
Ein hilfreicher Link zu finden: http://www.softpanorama.info/Tools/Find/using_exec_option_and_xargs_in_find.shtml
quelle
Sie können auch die Option -exec verwenden
quelle
Vorausgesetzt, bash 4+
Der abschließende Schrägstrich bedeutet, dass nur Verzeichnisse gefunden werden. Test ist vorher mit:
quelle
Angenommen , Sie verwenden gnu find , können Sie die Option -delete verwenden:
find . -name test -delete
das ist leichter zu merken.
quelle
Wie eine andere Antwort zeigt, können Sie versuchen, alle Verzeichnisse mit dem Namen zu finden
test
und zu löschenIch habe auf dem Mac einige Probleme mit der Cross-Kompatibilität festgestellt, daher habe ich diesen entsprechenden Befehl verwendet:
Wenn sich jedoch in einem der genannten Verzeichnisse
test
Dateien befinden,find
wird dies beklagtDirectory is not empty
, und das Verzeichnis kann nicht entfernt werden.Wenn Sie beabsichtigen, alle Dateien einschließlich des
test
Verzeichnisses zu löschen , können Sie mit demselben Trick alle Dateien in dentest
zuerst genannten Verzeichnissen löschen .Das Muster:
"*/test/*"
stellt sicher, dass nur Dateien in einem Verzeichnis mit dem Namen gelöscht werden/test/
. Sobald die Verzeichnisse leer sind, können wir die Verzeichnisse mit dem ersten Befehl löschen:Beispiel:
quelle