Suchen und löschen Sie alle Verzeichnisse mit dem Namen "test" unter Linux

35

Ich habe viele Verzeichnisse mit dem Namen "test" und möchte sie entfernen.

Ich kann sie finden und ausdrucken mit:

find . -name test -print

Wie entferne ich nun die Verzeichnisse?


Bitte beachten Sie, dass sich im Verzeichnis auch Dateien befinden, die ebenfalls entfernt werden müssen.

Müllabfuhr
quelle

Antworten:

70

xargs macht die ganze Magie:

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.)

Arnaud Le Blanc
quelle
1
Hervorragende Antwort, vor allem +in der Entdeckung. Ich hatte keine Ahnung, wünschte auf jeden Fall, ich hätte das schon vor langer Zeit gewusst.
Scott
achte auf den letzten befehl, irgendwie hat er einige dateien gelöscht. Der xargsBefehl funktionierte gut.
Henrique de Sousa
23
find /path/to/dir -name "test" -type d -delete
  • -name: sucht nach dem übergebenen Namen. Sie können -regexNamen basierend auf regulären Ausdrücken angeben

  • -type: Sucht nach Dateitypen. dsucht nur nach Verzeichnissen

  • -delete: Aktion, die die gefundene Liste löscht.

Alternative:

find /path/to/dir -name "test" -type d -exec rm -rf {} \;

Wie JF Sebastian in den Kommentaren feststellte:

Sie können +stattdessen auch \;mehrere Verzeichnisse gleichzeitig übergeben.

Jaypal Singh
quelle
1
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.
Jaypal Singh
5

Sie können auch die Option -exec verwenden

find . -name test -exec rm {} \;
sethi
quelle
3

Vorausgesetzt, bash 4+

shopt -s globstar
rm -r ./**/test/

Der abschließende Schrägstrich bedeutet, dass nur Verzeichnisse gefunden werden. Test ist vorher mit:

printf '%s\n' ./**/test/
Übelsuppe
quelle
2

Angenommen , Sie verwenden gnu find , können Sie die Option -delete verwenden:

find . -name test -delete

das ist leichter zu merken.

Chun Yang
quelle
2

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
Karl
quelle