#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