Comment puis-je supprimer tous les répertoires vides d'une sous-arborescence? J'ai utilisé quelque chose comme
find . -type d -exec rmdir {} 2>/dev/null \;
mais je dois être exécuté plusieurs fois afin de supprimer les répertoires contenant uniquement des répertoires vides. De plus, c'est assez lent, surtout sous cygwin.
Réponses:
En combinant les
find
options GNU et les prédicats, cette commande devrait faire le travail:-type d
restreint aux répertoires-empty
restreint à vider-delete
supprime chaque répertoireL’arbre est parcouru des feuilles sans qu’il soit nécessaire de spécifier
-depth
ce qu’il sous-entend-delete
.la source
-delete
implique déjà-depth
, vous n'avez donc pas besoin de spécifier cela manuellement.-mindepth 1
ici, pour empêcher la suppression du répertoire de départ lui-même, s'il était vide.!
a une signification spéciale pour la coquille. Vous devez y échapper. Quelque chose comme:\! -name 'Completed'
juste avant-delete
devrait fonctionner. Ou vous venez de mettre un fichier marqueur dans ce répertoire.Listez les répertoires profondément imbriqués en premier.
(Notez que la redirection s’applique à la
find
commande dans son ensemble, pas seulementrmdir
. Redirection uniquement pourrmdir
provoquerait un ralentissement important, car vous auriez besoin d’appeler un shell intermédiaire.)Vous pouvez éviter de s'exécuter
rmdir
sur des répertoires non vides en transmettant le-empty
prédicat à rechercher. GNU find teste le répertoire lorsqu'il est sur le point d'exécuter la commande. Ainsi, les répertoires qui viennent d'être vides seront récupérés.Une autre façon d'accélérer serait de regrouper les
rmdir
invocations. Les deux sont susceptibles d'être sensiblement plus rapides que l'original, en particulier sous Cygwin. Je ne m'attends pas à beaucoup de différence entre ces deux.La méthode la plus rapide dépend du nombre de répertoires non vides que vous avez. Vous ne pouvez pas combiner
-empty
des méthodes de regroupement d'appels, car les répertoires qui ne contiennent que des répertoires vides ne sont pas vides pour le momentfind
.Une autre méthode consiste à exécuter plusieurs passes. Cela dépend de nombreux facteurs, notamment de la possibilité que toute la hiérarchie des répertoires reste dans le cache du disque entre les
find
exécutions.Sinon, utilisez zsh. Le qualificatif glob
F
correspond aux répertoires non vides, donc aux/^F
répertoires vides. Les répertoires qui ne contiennent que des répertoires vides ne peuvent pas être appariés aussi facilement.(Cela se termine lorsque
rmdir
reçoit une ligne de commande vide.)la source
-p
? Je n'aurais pas pensé que cela ferait une différence.-empty
devrait fonctionner avec celui-ci (bien que je ne sois pas sûr de combien il gagnera). Et très, très trivialement, puisque vous ne voulez probablement pas enlever.
, utilisez-mindepth 1
.-depth
argument, ce qui rendrmdir -p
inutile. J'ai déjà changé mon commentaire. Le 90 s était ma tentative initiale; il n'y a rien d'étonnant ici.rmdir
complètement l'appel de commande, du moins avec GNU find, avec cette commande:find . -depth -type d -empty -delete
Si vous virez juste
-p
sur votrermdir
, qui va travailler en un seul passage. Ce ne sera pas beau ou optimal, mais il devrait tout avoir. Cela indique à rmdir de supprimer tous les répertoires parents non vides de celui que vous supprimez.Vous pouvez économiser un peu en ajoutant le
-empty
test à find, de sorte qu'il ne s'embarrasse pas de répertoires non vides.la source
find . -depth -type d -exec rmdir {} +
est la réponse la plus simple et conforme à la norme à cette question.
Les autres réponses données ici dépendent malheureusement toutes d’améliorations spécifiques aux fournisseurs qui n’existent pas sur tous les systèmes.
la source
find . -type d -printf "%d %p\n" |\ sort -nr |\ perl -pe 's/^\d+\s//;' |\ while read dir; do \ (rmdir "$dir" > /dev/null 2>&1); \ done
Voilà comment cela fonctionne:
rmdir
sur la liste un par unla source
J'utilise ces alias pour les
find
commandes fréquemment utilisées , notamment lorsque je nettoie de l'espace disque à l'aide de dupeguru , où la suppression des doublons peut générer de nombreux répertoires vides.Commentaires à l'intérieur
.bashrc
afin que je ne les oublie pas plus tard quand je dois le peaufiner.la source
rm -r */
la commande a fonctionné facilement pour moi.rm
devrait obliger-f
à supprimer de force les répertoires avec les fichiers.rm -r
ne devrait supprimer que les répertoires vides. Je suis ouvert aux raisons pour lesquelles cela pourrait être faux. Cela devrait également laisser des fichiers puisque*/
regarde seulement les dossiers.la source
rm
est principalement destiné à supprimer des fichiers. Tandis que*/
seulement correspond aux répertoires, je n'ai aucune idée de ce que cela fait à des niveaux plus profonds. Je peux aussi imaginer que cela ne fonctionne que sur certains systèmes.