Trouver des directorys vides récursivement

Comment puis-je find tous les directorys vides, disons, sur le directory /home/…/Desktop. Parce que je suis sur Solaris, je ne peux pas utiliser la find . -empty -type d find . -empty -type d command. Est-ce qu'il y a un autre moyen?

(Je n'ai pas de machine Solaris à scope de main, donc je travaille à partir de pages man, donc vous devrez peut-être jouer un peu avec la syntaxe ici.)

Vous pouvez utiliser le fait que n'importe quel directory vide aura un nombre de liens de 2 (seulement le nom du directory lui-même, dir , plus son propre dir/. , Lien vers lui); dans UNIX, il est illégal de lier (hard) à un directory sauf en cours de l'append à une seule input de directory ou d'y append des inputs de directory, donc c'est un invariant. (Fondamentalement 1. )

Solaris ne prend pas en charge l'option -empty , mais il prend en charge l' -links <n> pour searchr des objects avec exactement n liens. Donc la command que vous voulez (je pense , voir ci-dessous) est:

find /home/.../Desktop -type d -links 2 -print

au fait…

Votre utilisation du mot "récursivement" est un peu ambiguë, notez donc que cela ne finda pas de directorys contenant uniquement des directorys vides (ou récursivement). Si vous le souhaitez, la question est très simple si vous voulez les identifier afin de les supprimer . Il suffit d'exécuter à plusieurs resockets la command ci-dessus, en ajoutant -exec rmdir {} \; jusqu'à ce qu'il n'en rest plus aucun; à chaque fois que vous l'exécutez, vous supprimerez les parents des trees d'un niveau plus profond, donc il ne devrait pas y avoir beaucoup de runs à less que vous ayez un arborescence de directorys très profonde ne contenant que des directorys vides. (En fonction de la façon dont Solaris find (1) fonctionne, je pense que vous pouvez aussi lancer find . -type d -exec rmdir -p {}; une seule fois (l'option -p indique à rmdir (1) de supprimer les directorys contenant des directorys sont vides), mais comme il essaiera de parcourir les directorys supprimés, vous obtiendrez un certain nombre de messages d'erreur que vous pouvez ignorer avec ceux dont vous pourriez vous soucier, donc je le ferais de cette façon itérative. )

(Notez que l'option -depth de find (1) n'aide pas ici car les files sont stat () 'd trop tôt pour que le nombre de liens soit mis à jour) sinon vous pouvez lancer find -depth $dir -type d -links 2 -exec rmdir {} \; et un run serait suffisant.)

Si vous voulez identifier à la fois des directorys «insortingnsèquement vides» et des directorys ne contenant que des directorys vides (ou récursivement) sans les supprimer, c'est plus complexe. Je suppose qu'une seule command line est possible, mais ce sera une bête (je suis sûr que quelqu'un d'autre va prendre un coup de couteau à plus tard), au less sans recourir à perl ou une incantation folle sed / awk .

Mais ce que je ferais est de copyr l'arborescence de directorys quelque part, par exemple / tmp / tree-copy , puis exécutez la command

find /tmp/tree-copy -type d -links 2 -print -exec rmdir {} \; | tee -a /tmp/empty-dirlist

à plusieurs resockets jusqu'à ce qu'il ne produise plus de sortie. (Le tee -a vous permet de voir la sortie, mais l'ajoute aussi au file / tmp / empty-dirlist .)

Vous voudrez alors supprimer le /tmp/tree-copy ou n'importe quoi de chaque ligne du file;

perl -i -lpe 's{^/tmp/tree-copy/}{}' /tmp/empty-dirlist

travaillera pour cela, ou vous pouvez utiliser votre éditeur de text. Voilà! , une list des directorys vides, où "vide" est défini comme "ne contenant rien d'autre que des directorys". (Vous pourriez également mettre le perl , ou sed ou autre, dans le pipeline avant le tee -a si vous le souhaitez.)


  1. Avant que quelqu'un ne l'indique, cela n'est pas nécessairement vrai pour les points de assembly du système de files; les gestionnaires de filesystems de certains systèmes d'exploitation sont libres d'utiliser le nombre de liens du sharepoint assembly pour leur propre usage, de sorte que vous verrez souvent des directorys de points de assembly, vides ou non, avec un nombre de liens de 1 (illégal pour les directorys dans d'autres circonstances), 2 , ou quelque chose d'autre significatif mais pas lié à son nombre réel de liens. Donc, si vous allez faire ce qui précède, vous devriez vérifier que vous ne traversez pas potentiellement les points de assembly, car il est possible, quoique peu probable, que l'un d'entre eux ait un nombre de liens de 2.