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.


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 .


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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.