Comment chmoder récursivement tous les répertoires sauf les fichiers ?

Comment chmod 755 tous les répertoires mais aucun fichier (récursivement) ?

Inversement, comment donner un chmod uniquement aux fichiers (récursivement) mais pas aux répertoires ?

Solution

Pour donner récursivement aux répertoires des privilèges de lecture et d'exécution :

find /path/to/base/dir -type d -exec chmod 755 {} +

Pour donner récursivement les privilèges de lecture aux fichiers :

find /path/to/base/dir -type f -exec chmod 644 {} +

Ou, s'il y a beaucoup d'objets à traiter :

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

Ou, pour réduire le frai de chmod :

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
Commentaires (5)

Une raison courante pour ce genre de chose est de mettre les répertoires à 755 mais les fichiers à 644. Dans ce cas, il existe un moyen un peu plus rapide que l'exemple de find de Nik :

chmod -R u+rwX,go+rX,go-w /path

Signification :

  • -R = récursivement ;
  • u+rwX = Les utilisateurs peuvent lire, écrire et exécuter ;
  • go+rX = le groupe et les autres peuvent lire et exécuter ;
  • go-w = le groupe et d'autres personnes ne peuvent pas écrire

La chose importante à noter ici est que la majuscule X agit différemment de la minuscule x. En manuel, nous pouvons lire :

Les bits d'exécution/de recherche si le fichier est un répertoire ou l'un des bits d'exécution/de recherche sont définis dans le mode original (non modifié).

En d'autres termes, chmod u+X sur un fichier n'activera pas le bit d'exécution, et g+X ne l'activera que s'il est déjà activé pour l'utilisateur.

Commentaires (7)

Si vous voulez vous assurer que les fichiers sont définis sur 644 et qu'il y a des fichiers dans le chemin qui ont le drapeau d'exécution, vous devrez d'abord supprimer le drapeau d'exécution. Le +X ne supprime pas l'indicateur d'exécution des fichiers qui l'ont déjà.

Exemple :

chmod -R ugo-x,u+rwX,go+rX,go-w path

Mise à jour : cela semble échouer parce que le premier changement (ugo-x) rend le répertoire non exécutable, donc tous les fichiers en dessous ne sont pas modifiés.

Commentaires (2)