web-dev-qa-db-fra.com

Chmod récursivement

J'ai une archive, qui est archivée par quelqu'un d'autre, et je souhaite automatiquement, après l'avoir téléchargée, changer 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).

J'ai examiné ce sujet: chmod: Comment ajouter de manière récursive des autorisations d'exécution uniquement aux fichiers disposant déjà de l'autorisation d'exécution comme dans d'autres, mais pas de joie.

Les répertoires viennent à l’origine avec plusieurs, mais tous sont faux, ils peuvent apparaître sous la forme:

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

Ce ne sont que les rares que j'ai découvertes jusqu'à présent, mais pourraient être plus.

Les erreurs find lorsque vous essayez de regarder dans un répertoire sans permission x et ne le transmettez donc pas à chmod. Ce que je faisais jusqu’à présent, c’est de modifier manuellement les autorisations sur le répertoire parent, puis d’aller dans les répertoires enfants et de faire la même chose pour eux, etc. Mais c'est beaucoup de travail manuel. N'y a-t-il pas moyen de le faire automatiquement?

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

faire:

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

jusqu'à ce que je reçois pas d'erreurs, puis

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

Mais il doit y avoir un meilleur moyen.

214
user797257

Vous devez disposer d'un accès en lecture, en plus d'exécuter l'accès, pour répertorier un répertoire. Si vous ne disposez que d'un accès d'exécution, vous pouvez alors connaître le nom des entrées du répertoire, mais aucune autre information (pas même les types, donc vous ne savez pas quelles entrées sont des sous-répertoires). Cela fonctionne pour moi:

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

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

Dans l'exemple ci-dessous, l'indicateur d'exécutable est effacé, puis défini 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 - efface l'indicateur eXecutable pour foo
  • chmod +x foo - définir l'indicateur eXecutable pour foo
  • chmod go+x foo - comme ci-dessus, mais réglez l'indicateur uniquement pour Groupe et Autre utilisateurs, ne touchez pas l'autorisation Utilisateur (propriétaire)
  • chmod go+X foo - idem que ci-dessus, mais ne s'applique qu'aux répertoires, ne touchez pas les fichiers
  • chmod -R go+X foo - comme ci-dessus, mais faites ceci Récursivement pour tous les sous-répertoires de foo
159
Dmitry Vasilyanov

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

chmod -R +xr
75
choroba

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

chmod -R 0755

Pour tout ouvrir grand:

chmod -R 0777
45
Tim Jensen

Ajout de permissions exécutables, récursivement, à tous les fichiers (pas les dossiers) du dossier en cours portant l'extension sh:

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

* Notez le pipe (|)

13
AlikElzin-kilaka

Donnez 0777 à tous les fichiers et répertoires à partir du chemin actuel:

chmod -R 0777 ./

0
Anthony Vinay