1 votes

Trouver tous les sous-répertoires finaux dans un arbre

Étant donné la structure suivante:

oz123@debian:~/ $ tree .
.
 a
   a1
   a2
   a3
 a1
   a11
   a12
   a31
 b
   b1
       b11
          b21
              b31
       b12
       b3
 c

16 répertoires, 0 fichiers

Comment puis-je trouver tous les nœuds finaux?

J'ai trouvé les solutions suivantes qui semblent bonnes, mais je dois prouver qu'il n'y a pas de cas de test qui les fera échouer.

La page d'aide de -links indique:

Vous pouvez également rechercher des fichiers ayant un certain nombre de liens, avec ‘-links’. Les répertoires ont normalement au moins deux liens physiques; leur entrée . est le deuxième. S'ils contiennent des sous-répertoires, chacun de ceux-ci a aussi un lien physique appelé .. vers son répertoire parent. Les entrées de répertoire . et .. ne sont normalement pas recherchées à moins qu'elles ne soient mentionnées sur la ligne de commande de recherche.

Solution possible:

oz123@debian:~/ $ find .  -type d  -links 2
./a/a2
./a/a3
./a/a1
./c
./a1/a31
./a1/a11
./a1/a12
./b/b1/b12
./b/b1/b3
./b/b1/b11/b21/b31
  • Est-ce que quelqu'un peut fournir une meilleure solution (sans utiliser de tubes et de sed, cela doit être performant ...)
  • Cela fonctionnera-t-il sur n'importe quel système de fichiers?

0 votes

Cela fonctionnera sur n'importe quel système de fichiers UNIX, je ne sais pas comment les pilotes vfat et ntfs-3g émulent la sémantique des inodes.

0 votes

@HubertKario, une question très importante: est-ce que cela fonctionnera sur les filers NetApp via NFS?

0 votes

Je ne suis pas sûr de NetApp, mais il fonctionne sur NFS entre les boîtes Linux donc je suppose que oui.

1voto

Rishi Raj Points 23

https://stackoverflow.com/questions/4269798/use-gnu-find-to-show-only-the-leaf-directories

find . -type d -exec sh -c '(ls -p "{}"|grep />/dev/null)||echo "{}"' \;

Plus lent que

find .  -type d  -links 2

de toute façon.

0voto

Zafar Points 241

Essayez la ligne de commande suivante :

find . -type d -execdir sh -c 'test -z "$(find "{}" -mindepth 1 -type d)" && echo $PWD/{}' ';'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X