Pour modifier les droits récursivement sur une arborescence, il faut généralement attribuer les droits d’exécution aux répertoires, afin de pouvoir les traverser. Mais si on fait un chmod -R tous les fichiers vont aussi se retrouver exécutables, et c’est mal !
Pour éviter cela, il faut attribuer les droits différemment sur les fichiers et répertoires avec à la commande suivante :
$ find ./ -type d | xargs chmod 751 $ find ./ -not -type d | xargs chmod 760
Détail sur les commandes utilisées :
xargs
On utilise la commande xargs qui permet de d’exécuter des commandes sur tous les éléments de la sortie standard. Le ‘{}’ est la variable qui sera remplacée par la chaine de sortie.
Le code ci dessus ne fonctionnera pas correctement si vous avez des espaces dans les noms de fichiers. En effet xargs prend les espaces pour des séparateurs d’arguments. Dans ce cas il est possible de mettre chaque argument entre deux cotes grâce à sed :
sed
C’est un éditeur de flux qui permet des modifications soit dans un fichier soit sur le flux à la sortie du pipe. Si vous voulez maitriser sed le tutoriel du site CommentCaMarche disponible ici est très complet.
La syntaxe pour ce qui nous intéresse (ajouter une cote au début et une à la fin) est la suivante :
sed -e "s,[^.],\'&," -e "s,\$,\',"
Note : Ce code est issu du site Modern Sourcery
Donc au final nous avons cela :
$ find ./ -type d | sed -e "s,[^.],\'&," -e "s,\$,\'," | xargs chmod 751 $ find ./ -not -type d | sed -e "s,[^.],\'&," -e "s,\$,\'," | xargs chmod 760