Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/02/2013, à 13:54

Gokukan

Modifier les droits du dernier dossier d'une arborescence

Bonjour,
Dans une arborescence ayant plusieurs dossiers, chaque dossier à une profondeur variable de sous-dossiers.

/rep/
      repA/rep1/rep2/rep3
      repB/rep1
      repC/rep1/rep2/rep3/rep4/rep5/rep6/rep7/rep8
      repD/rep1/rep2/rep3/rep4/rep5/rep6/rep7.1
      repD/rep1/rep2/rep3/rep4/rep5/rep6/rep7.2
      repE/rep1/rep_n

Je souhaiterai choper le dernier dossier en bout de chaîne de chaque branche afin de lui modifier ses droits.
Vu que chaque branche à une profondeur variable, je sèche !

Peut-être un find pourrait m'afficher uniquement les dossiers (chemin complet/relatif) où les branches sont les + profondes ?

Dernière modification par Gokukan (Le 12/02/2013, à 14:35)

Hors ligne

#2 Le 12/02/2013, à 22:31

pingouinux

Re : Modifier les droits du dernier dossier d'une arborescence

Bonsoir,
Pas très joli, mais devrait convenir :

find -type d >liste
while read rep;do [[ $(grep -c "^$rep\>" liste) == 1 ]] && echo "$rep"; done <liste

Il suffit ensuite de remplacer echo par chmod si le résultat est correct.

Ajouté :
Voici une autre façon qui me paraît plus propre, et sans doute plus rapide si le nombre de répertoires est important :

rep0="";while read rep;do [[ $rep0 =~ ^$rep/ ]] || echo "$rep"; rep0="$rep"; done < <(find -depth -type d)

Édité : Correction pour tenir compte des noms de répertoires contenus dans un autre (comme repB/rep1 et repB/rep11, par exemple)

Test de performance sur 8000 répertoires :

Première commande

real	0m11.667s
user	0m0.440s
sys	0m1.412s

Seconde commande

real	0m0.703s
user	0m0.552s
sys	0m0.128s

Dernière modification par pingouinux (Le 13/02/2013, à 10:12)

Hors ligne

#3 Le 13/02/2013, à 17:17

Gokukan

Re : Modifier les droits du dernier dossier d'une arborescence

Merci, cela fonctionne. Je ne connais pas l'assemblage de ce bout de code : ~ ^$rep/
Peux-tu stp m'expliquer ?

Hors ligne

#4 Le 13/02/2013, à 17:37

pingouinux

Re : Modifier les droits du dernier dossier d'une arborescence

Voir man bash, rubrique SHELL GRAMMAR -> Compound Commands.

$rep0 =~ ^$rep/

est vrai si la variable rep0 commence par la variable rep suivie de /

Par exemple :

repA/rep1/rep2/rep3 =~ repA/rep1/rep2

est vrai, mais pas

repA/rep1/rep22/rep3 =~ repA/rep1/rep2

Le find liste tous les répertoires (ceux en bout d'arborescence et les autres), en commençant par les plus profonds (grâce à l'option -depth).
On élimine ensuite ceux qui sont le début d'un répertoire qui précède :

repA/rep1/rep2/rep3
repA/rep1/rep2    # Éliminé
repA/rep1         # Éliminé
repA              # Éliminé

Hors ligne