Supprimer des sous-repertoires vides

Après réorganisation de ma musique, je me retrouve avec de nombreux répertoires et sous-répertoires vides.

Je voudrais les supprimer en une commande bash.

Ce que je cherche est du genre :

rmdir -p a/b/c (qui va supprimer le dossier c et les dossiers parents b et a) mais dans l’autre sens : je veux me placer dans mon dossier de musique et lancer une commande qui va supprimer a/b/c (a + b + c) si il n’y a pas de fichier dans c…

ça me rappelle mes cours d’informatique ou une fonction s’appelle elle même pour parcourir des arbres.
Tu fais une fonction qui teste si tu es au bout de la branche (pas de sous-rep), et si le rep est vide, tu le supprimes. Puis tu appelles cette fonction à l’intérieur d’elle même.
Je ne sais pas si ça fonctionne en bash, mais en python , oui.
Je crois que ça s’appelle la récursivité

oui ou avec une boucle (loop) mais j’ai dû mal à transcrire ça par une commande.

Si quelqu’un a une proposition…

C’est très moche, mais ça marche :

(à adapter bien sûr à la profondeur de ton arborescence)

Je suis moi aussi intéressé par une commande plus propre.

mdr je n’y avais pas pensé mais effectivement ça marche !

[code]#!/bin/bash

En paramètre, le dossier de départ pour la recherche/suppression récursive des dossiers vides

while liste_dossiers_vides=find "$1" -type d -empty
do
for un_dossier_vide in $liste_dossiers_vides
do
echo "Suppression du dossier vide “$un_dossier_vide”"
rmdir "$un_dossier_vide"
done
done
if [ -e “$1” ]; then
$0 “$1” # récursivité
fi
[/code]
Merci à ceux qui me donnerons des conseils pour rendre ce script plus “propre”

[quote=“MicP”] if [ -e "$1" ]; then $0 "$1" # récursivité fi
Merci à ceux qui me donnerons des conseils pour rendre ce script plus “propre”[/quote]

Tu fait appel à la récursivité au cas où un répertoire vide supprimé rende un autre répertoire vide ? Ce n’est pas déjà assuré par ta boucle “while” ?

d’ailleurs, pourquoi faire un while ?
La récursivité assure le parcours de l’arbre

Merci beaucoup pour vos conseils éclairés, je vais en tenir compte.
J’ouvrirai un autre fil dans “programmation” pour ne pas allonger celui là qui est résolu, et j’espère vous y retrouver.
Merci encore.

Bonjour,

Désolé de déterrer ce topic mais j’ai une proposition plus simple pour ceux qui tomberaient sur ce forum.
Je considère qu’on se trouve à l’endroit dans lequel on veut supprimer les dossiers et sous-dossiers… vides :

Explication :
find * -type d : cherche tous les répertoires (et sous-rep, etc…)
-exec rmdir ‘{}’ : pour chaque dossier trouvé, rmdir est exécuté. Comme chacun le sait, rmdir ne supprime pas les dossiers non vides. Pour ne pas qu’il affiche une erreur pour les dossiers non vides, j’utilise l’option –ignore-fail-on-non-empty
Donc seuls les répertoires, sous-rep, sous-sous-rep, etc… sont supprimés, et sans générer d’erreur.

Salut,

C’est sympa ce retour.

J’ai une question cependant, en consultant le man de find, je ne trouve aucune référence à cette option, peux-tu nous en dire plus ?

Bonjour,

Je me permets de répondre, c’est un option de rmdir :033

extrait du man rmdir :

[quote]–ignore-fail-on-non-empty

          ignorer les échecs qui ne sont causés que par la non-vacuité d'un répertoire[/quote]

c’est très mignon en effet :mrgreen:

En fait on peut faire encore plus simple avec find, sans utiliser rmdir :

Je pense que cette commande est suffisamment explicite, mais je peux détailler au besoin :wink:

Bien vu vv222 !
Vaut mieux utiliser les options du find sans avoir recours au rmdir.
Testé et approuvé :041