Chmod récursivement


249

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, modifier une branche du système de fichiers dans les fichiers extraits pour accéder en lecture. (Je ne peux pas changer la façon dont l'archive est créée).

J'ai examiné ce fil: chmod: comment ajouter récursivement des autorisations d'exécution uniquement aux fichiers qui ont déjà une autorisation d'exécution comme dans d'autres, mais pas de joie.

Les répertoires sont à l'origine livrés avec plusieurs mais tous les mauvais drapeaux, ils peuvent apparaître comme:

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

Ce ne sont que quelques-uns que j'ai découvert jusqu'à présent, mais cela pourrait être plus.

finddes erreurs lors d'une tentative de recherche dans un répertoire sans xautorisation et ne le transmet donc pas chmod. Ce que j'ai fait jusqu'à présent, c'est modifier manuellement les autorisations sur le répertoire parent, puis aller dans les répertoires enfants et faire la même chose 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 ne reçoive aucune erreur,

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

Mais il doit y avoir un meilleur moyen.


3
-r pas le même que -R
PJ Brunet

Remarque diverse, si vous voulez dire que toutes les autorisations de groupe correspondent aux autorisations du propriétaire (semble moins susceptible de tout foutre en place à l'OMI), c'est tout à fait possible pour serverfault.com/a/284478/210994
ThorSummoner

Réponses:


131

Vous avez besoin d'un accès en lecture, en plus d'exécuter l'accès, pour répertorier un répertoire. Si vous disposez uniquement d'un accès d'exécution, vous pouvez trouver les noms des entrées dans le répertoire, mais pas d'autres informations (pas même les types, vous ne savez donc pas lesquelles des entrées sont des sous-répertoires). Cela fonctionne pour moi:

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

2
Quelle est la différence entre '\;' et «+» qui a été utilisé par le PO à la fin de la commande?
kon psych

1
@konpsych Construit apparemment +la ligne de commande d'une manière différente. Je n'en étais pas vraiment conscient; \;est la manière habituelle, avec une commande par fichier qui correspond à la recherche.
Fred Foo

Ne fonctionne pas si certains fichiers ont des espaces dans leur nom
Soonts

3
@Soonts Alors "{}"au lieu de {}devrait le réparer.
user4642212

J'ai exécuté cela sous le sous-système Linux sur Windows 10 et cela a eu l'effet inverse. La plupart des autorisations de fichiers ont été supprimées.
Max Candocia

176

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

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

~$ 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ésactivez le drapeau eXecutable pourfoo
  • chmod +x foo- définir le drapeau eXecutable pourfoo
  • chmod go+x foo- identique à ci-dessus, mais définissez le drapeau uniquement pour les utilisateurs de groupe et autres , ne touchez pas la permission de l' utilisateur (propriétaire)
  • chmod go+X foo - comme ci-dessus, mais ne s'applique qu'aux répertoires, ne touchez pas aux fichiers
  • chmod -R go+X foo- comme ci-dessus, mais procédez de manière récursive pour tous les sous-répertoires defoo

80

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

chmod -R +xr

Cela mettra également des autorisations d'exécution sur tous les non-répertoires.
Fred Foo

1
Oui. Cela remplace simplement la première étape itérée. Vous devez encore courir find -type f -exec chmod -x {} +après.
choroba

50

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

chmod -R 0755

Pour que tout soit grand ouvert:

chmod -R 0777

12
Ajouter l'emplacement actuel du dossier:chmod -R 0777 .
Danijel

18

Ajouter des autorisations exécutables, récursivement , à tous les fichiers (pas les dossiers) dans le dossier actuel avec l' shextension:

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

* Remarquez le tuyau ( |)


2

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

chmod -R 0777 ./

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.