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.
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 {} \;
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 fichierschmod -R go+X foo
- comme ci-dessus, mais faites ceci Récursivement pour tous les sous-répertoires de foo
Essayez de changer toutes les autorisations en même temps:
chmod -R +xr
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
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 (|
)
Donnez 0777 à tous les fichiers et répertoires à partir du chemin actuel:
chmod -R 0777 ./