web-dev-qa-db-fra.com

Comment puis-je rechercher récursivement un répertoire par son nom et supprimer son contenu (y compris tous les sous-répertoires et fichiers) tout en conservant le répertoire lui-même?

Étant donné:

  1. J'ai une arborescence avec des dossiers EmptyMeà différents niveaux
  2. EmptyMerépertoires contiennent des sous-répertoires et des fichiers

Obligatoire:

  1. Vider le contenu des répertoires EmptyMe(y compris leurs sous-répertoires), tout en conservant ces répertoires (sans les supprimer).

Question:

Qu'est-ce que la commande Unix pour rechercher récursivement tous les répertoires EmptyMedu niveau actuel et supprimer tout leur contenu (y compris les sous-répertoires), tout en conservant les répertoires EmptyMesur le disque?

Ma tentative:

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

Comme vous pouvez le constater, cette commande a tenté de supprimer EmptyMename__, par opposition à son contenu.

Merci!

6
temuri

Essai:

find . -path '*/EmptyMe/*'

Suppression réelle:

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

-path '*/EmptyMe/*' signifie correspond à tous les éléments qui se trouvent dans un répertoire appelé EmptyMe.

9
wjandrea

Une option possible consiste à imbriquer les commandes:

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

find -type d -name 'EmptyMe' externe recherche les répertoires requis et exécute la commande findintérieure via -exec ... \;. La commande interne descend dans le répertoire trouvé (référencée via {}) et, comme nous utilisons -delete dans cet indicateur, elle devrait suivre la recherche en profondeur en premier, la suppression des fichiers, puis les sous-répertoires.

3
Sergiy Kolodyazhnyy

Cela fonctionne, mais cela donne des erreurs si les répertoires EmptyMe sont vides.

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

Exemple d'erreur:

rm: cannot remove ‘./EmptyMe/*’: No such file or directory
0
wjandrea