Wie lösche ich Verzeichnisinhalte (und nicht das Verzeichnis selbst) mit find -exec und rm?

7

Ich versuche, den Inhalt einiger Verzeichnisse (aber nicht des Verzeichnisses selbst) folgendermaßen zu löschen:

find -type d -name someDirs -exec rm -rf {}/* \;

Aber es funktioniert nicht. Irgendwelche Tipps?

user1700840
quelle

Antworten:

5

Das Problem mit Ihrem Befehl ist, dass die Platzhaltererweiterung von Ihrer Shell durchgeführt wird, bevor der Befehl tatsächlich aufgerufen wird. Da Ihre Shell keine passende Datei findet {}/*(da Sie {}im aktuellen Verzeichnis kein Verzeichnis mit einem Literalnamen haben ), *wird die Datei unverändert an den Befehl übergeben, der dann geändert wird find, um Dateien mit dem Namen Literal *in Ihrem Verzeichnis zu löschen someDirsVerzeichnisse, da der rmBefehl (erneut) keine Platzhalter erweitert. Sie können dies durch Ausführen "debuggen"

find -type d -name someDirs -exec echo rm -rf {}/* \;

stattdessen. Um sicherzustellen, dass die Shell die Möglichkeit hat, Ihre zu erweitern *, lassen Sie eine execweitere Shell erzeugen, die die Shell wie folgt erweitern kann *(und den Befehl davor schützt, zuerst mit einfachen Anführungszeichen erweitert zu werden):

find -type d -name someDirs -exec sh -c 'rm -rf {}/*' \;

oder testen Sie es so:

find -type d -name someDirs -exec sh -c 'echo rm -rf {}/*' \;
mihi
quelle
9

Sie können das Verzeichnis (oder die Verzeichnisse) als Argumente findangeben und anweisen, es mit der folgenden -mindepthOption zu überspringen :

-mindepth Ebenen Wenden
Sie keine Tests oder Aktionen auf Ebenen an, die kleiner als Ebenen sind (eine nicht negative Ganzzahl).
-mindepth 1 bedeutet, dass alle Dateien mit Ausnahme der Befehlszeilenargumente verarbeitet werden.

Ihr Befehl wäre also:

find SomeDir1 SomeDir2 -mindepth 1 -exec rm -rf '{}' \+
whoan
quelle
6
  find . -type f -delete

löscht alle Dateien im und unter dem aktuellen Verzeichnis und lässt die Verzeichnisstruktur in Ruhe.

Wenn Ihr Befehl find -delete nicht unterstützt (er ist etwas modern, aber seit einigen Jahren da), dann:

  find . -type f -exec rm {} \;

Bearbeiten: Wie von Nate bemerkt, ist dies nicht die richtige Antwort.

Craig Miskell
quelle
Es sieht für mich so aus, als ob das OP nicht nur die Dateien, sondern auch die Verzeichnisse unter löschen möchte someDirs, nur nicht someDirsselbst. Wir wollen also die Verzeichnisstruktur nicht in Ruhe lassen. Ich habe einen Kommentar hinterlassen und um Klarstellung gebeten.
Nate Eldredge
Wenn ja, wird cd somdDirs && rm -r * den Trick machen, aber es ist extrem beängstigend zu posten :)
Craig Miskell
Während ich es lese, sind möglicherweise viele Verzeichnisse benannt someDirs, möglicherweise in unterschiedlichen Tiefen unterhalb des aktuellen Verzeichnisses.
Nate Eldredge
Ahhh ich verstehe. Guter Punkt.
Craig Miskell
Vielleicht etwas mit -regex oder -path, aber ich kann nichts empfehlen (das Risiko ist ... hoch :))
Craig Miskell