Wie kann ich ein Verzeichnis rekursiv nach Namen suchen und seinen Inhalt (einschließlich aller Unterverzeichnisse und Dateien) löschen, während ich das Verzeichnis selbst behalte?

7

Gegeben :

  1. Ich habe eine Baumstruktur mit Ordnern EmptyMeauf verschiedenen Ebenen
  2. EmptyMe Verzeichnisse enthalten Unterverzeichnisse und Dateien

Erforderlich :

  1. Leeren Sie den Inhalt von EmptyMeVerzeichnissen ( einschließlich ihrer Unterverzeichnisse), während Sie diese Verzeichnisse behalten (ohne sie zu löschen).

Frage :

Was ist der Unix-Befehl, um alle EmptyMeVerzeichnisse der aktuellen Ebene rekursiv zu finden und ihren gesamten Inhalt (einschließlich Unterverzeichnisse) zu löschen, während EmptyMeVerzeichnisse auf der Disc bleiben?

Mein Versuch :

$ find . -name 'EmptyMe' -type d -exec rm -- {} +
rm: cannot remove `./a/b/c/d/EmptyMe': Is a directory

Wie Sie sehen können, hat dieser Befehl versucht, ihn zu entfernen EmptyMe, im Gegensatz zu seinem Inhalt.

Temuri
quelle
Nest es vielleicht? find . -name 'EmptyMe' -type d -exec find {} -type f -delete \;Lassen Sie mich wissen, wenn Sie dies als tatsächliche Antwort wollen
Sergiy Kolodyazhnyy
Das hat Unterverzeichnisse von nicht entfernt EmptyMe.
Temuri
1
@Sergiy Sie benötigen -mindepth 1den verschachtelten Befehl und entfernen, -type fweil OP auch Verzeichnisse entfernen möchte.
Wjandrea

Antworten:

9

Testlauf:

find . -path '*/EmptyMe/*'

Echte Löschung:

find . -path '*/EmptyMe/*' -delete

-path '*/EmptyMe/*'bedeutet , dass alle Elemente in einem Verzeichnis mit dem Namen übereinstimmenEmptyMe .

wjandrea
quelle
3

Eine Option, die verwendet werden kann, besteht darin, die Befehle zu verschachteln:

find . -type d -name 'EmptyMe'  -exec find {} -mindepth 1 -delete \;

Das äußere find -type d -name 'EmptyMe'findet die erforderlichen Verzeichnisse und führt den inneren findBefehl über aus -exec ... \;. Der innere Befehl wird in das gefundene Verzeichnis verschoben (auf das über verwiesen wird {}). Da wir hier das -deleteFlag verwenden, sollte er der Tiefensuche folgen und Dateien und dann Unterverzeichnisse entfernen.

Sergiy Kolodyazhnyy
quelle
0

Dies funktioniert, gibt jedoch Fehler aus, wenn die EmptyMeVerzeichnisse leer sind.

find . -name 'EmptyMe' -type d -exec sh -c 'rm -r -- "$1"/*' sh {} \;

Fehlerbeispiel:

rm: cannot remove ‘./EmptyMe/*’: No such file or directory
wjandrea
quelle
Können Sie bitte die akzeptierte Antwort mit dem Fix aktualisieren, um diesen Fehler zu vermeiden?
Temuri
@temuri Sie sind verschiedene Lösungen, also habe ich sie in verschiedene Antworten gegeben
wjandrea
Es ist leider nicht klar, welche Lösung genau den Fehler "Keine solche Datei oder kein solches Verzeichnis" vermeiden würde. Können Sie bitte klarstellen?
Temuri
@ Temuri Oh, Gotcha. Sergiy und meine andere Antwort vermeiden diesen Fehler, da sie nicht davon ausgehen, dass die EmptyMeVerzeichnisse Inhalt haben.
Wjandrea