Bonjour !
Marc Terrier a écrit :
> 1 #!/bin/bash
> 2
> 3 ls -Rl | awk '$1~/:$/' > /tmp/all_dirs
> 4
> 5 while read dirname ; do
> 6 dirname=`echo ${dirname} | sed -e 's/:$/\//'`
> 7 nbocc=`grep ${dirname} /tmp/all_dirs | wc -l`
> 8 if [ "${nbocc}"="0" ] ; then
> 9 echo ${dirname}
> 10 fi
> 11 done < /tmp/all_dirs
Je vois quelques petits problèmes dans ton code.
Ligne 3, ton ls ne liste pas les répertories dont le nom commence par un
point (répertories cachés). Aussi, les répertories dont tous les
sous-répertories sont cachés seront considérés à tort comme feuilles.
Donc il faudrait "ls -lRA".
Toujours ligne 3, awk va rejeter les répertoires qui contiennent un
espace dans leur nom. Oui, je sais, c'est mal de mettre des espaces dans
les noms de répertoires ou fichiers, mais ça se trouve, surtout quand
ils viennent d'un environnement non-unixien. Et si tu modifies la
commande awk pour accepter les espaces, alors tu risques d'accepter
aussi les fichiers ordinaires dont le nom finit par ":". Oui, c'est
tordu, mais c'est possible. Finalement le plus simple est de remplacer
la ligne 3 par "find . -type d > /tmp/all_dirs".
Ligne 7, si $dirname a un espace, grep ne marchera pas, il faut des
guillemets autour de ${dirname}. Si $dirname vaut "./toto/", alors
"./tata./toto/tutu:" sera reconnu à tord comme un de ses
sous-répertoires. Il faut ancrer la chaîne cherchée avec "^". Par
ailleurs, si $dirname vaut "./to.o/", alors "./toto/tutu:" sera reconnu
comme un de ses comme sous-répertoires. Il faut grep -F pour chercher
une chaîne littérale. Mais alors je ne sais pas l'ancrer !
Ligne 8, je ne sais pas pourquoi, mais ça n'a pas l'air de marcher :
[ "1"="0" ] && echo "equal" || echo "different"
afiche "equal". Ça marche mieux si tu mets des espaces autour du "=".
Ciao,
Edgar.