252 votes

Chmod récursivement

J'ai une archive, qui est archivée par quelqu'un d'autre, et je veux automatiquement, après l'avoir téléchargée, modifier une branche du système de fichiers dans les fichiers extraits pour obtenir un accès en lecture. (Je ne peux pas changer la façon dont l'archive est créée).

Je me suis penché sur ce fil : chmod : Comment ajouter récursivement des permissions d'exécution seulement aux fichiers qui ont déjà la permission d'exécution ? comme dans d'autres, mais sans succès.

Les répertoires sont originellement fournis avec des drapeaux multiples mais tous faux, ils peuvent apparaître comme :

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Ce ne sont que les quelques exemples que j'ai découverts jusqu'à présent, mais il pourrait y en avoir d'autres.

find des erreurs lorsqu'il tente de consulter un répertoire sans x et ne le transmet donc pas à l'utilisateur. chmod . Ce que j'ai fait jusqu'à présent, c'est changer manuellement les permissions sur le répertoire parent, puis aller dans les répertoires enfants et faire de même pour eux et ainsi de suite. Mais c'est beaucoup de travail manuel. N'y a-t-il pas un moyen de le faire automatiquement ?

C'est-à-dire comment je le fais maintenant :

faire :

$ chmod -R +x
$ chmod -R +r

jusqu'à ce que je n'obtienne aucune erreur, puis

$ find -type f -exec chmod -x {} +

Mais il doit y avoir un meilleur moyen.

179voto

Dmitry Vasilyanov Points 438

Vous pouvez utiliser chmod avec l'option X la lettre de mode (le X majuscule) pour définir le drapeau exécutable uniquement pour les répertoires.

Dans l'exemple ci-dessous, le drapeau exécutable est effacé, puis activé pour tous les répertoires de manière récursive :

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Un peu d'explication :

  • chmod -x foo - dégager le eXecutable pour foo
  • chmod +x foo - fixer le eXecutable pour foo
  • chmod go+x foo - comme ci-dessus, mais mettre le drapeau seulement pour Groupe y Autre utilisateurs, ne touchez pas à la Utilisateur (propriétaire) permission
  • chmod go+X foo - même chose que ci-dessus, mais s'applique uniquement aux répertoires, ne touche pas aux fichiers
  • chmod -R go+X foo - même chose que ci-dessus, mais faites ceci De manière récursive pour tous les sous-répertoires de foo

131voto

larsmans Points 167484

Vous devez avoir un accès en lecture, en plus d'un accès en exécution, pour lister un répertoire. Si vous n'avez qu'un accès en exécution, vous pouvez trouver les noms des entrées du répertoire, mais aucune autre information (pas même les types, donc vous ne savez pas lesquelles des entrées sont des sous-répertoires). Cela fonctionne pour moi :

find . -type d -exec chmod +rx {} \;

82voto

choroba Points 56333

Essayez de changer toutes les persmissions en même temps :

chmod -R +xr

51voto

Tim Jensen Points 521

Pour que tout soit accessible en écriture par le propriétaire, en lecture/exécution par le groupe, et exécutable par le monde :

chmod -R 0755

Pour que tout soit grand ouvert :

chmod -R 0777

18voto

Ajout de permissions pour les exécutables, récursivement à tous les fichiers (pas aux dossiers) du dossier actuel avec sh extension :

find . -name '*.sh' -type f | xargs chmod +x

* Remarquez le tuyau ( | )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X