Donne les droits d'exécution aux répertoires mais pas aux fichiers

7

J'ai une structure de répertoires avec des fichiers et des répertoires et j'aime attribuer des autorisations afin que tous les fichiers et répertoires disposent d'autorisations de lecture-écriture pour l'utilisateur et d'autorisations de lecture pour le groupe, ainsi que d'autorisations d'exécution sur le répertoire.

J'aimerais réaliser quelque chose comme ça:

$ ls -l
total 16
-rw-r----- 1 daniel daniel    0  5 23 16:20 1
-rw-r----- 1 daniel daniel    0  5 23 16:20 2
-rw-r----- 1 daniel daniel    0  5 23 16:20 3
-rw-r----- 1 daniel daniel    0  5 23 16:20 4
-rw-r----- 1 daniel daniel    0  5 23 16:20 5
drwxr-x--- 2 daniel daniel 4096  5 23 16:00 a
drwxr-x--- 2 daniel daniel 4096  5 23 16:00 b
drwxr-x--- 2 daniel daniel 4096  5 23 15:59 c
drwxr-x--- 2 daniel daniel 4096  5 23 15:59 d
Daniel
la source

Réponses:

11

Pour donner l’autorisation d’exécution (recherche) aux répertoires, mais pas aux fichiers, utilisez:

chmod -R +X .

Pour attribuer toutes les autorisations comme dans votre exemple, utilisez:

chmod -R u=rwX,g=rX,o= .

-Rmodifie les fichiers et les répertoires de manière récursive, tandis que les +Xensembles exécutent / recherchent uniquement si le fichier est un répertoire ou dispose déjà de l'autorisation d'exécution pour un utilisateur. ret wsont bien sûr pour la lecture et l'écriture, respectivement.

Le mode X( x supérieur ) est décrit à la fois dans la page de manuel traditionnelle 1 et dans la documentation d’information 2 .

Cela devrait également fonctionner sur d'autres systèmes similaires à Unix, tels que FreeBSD , NetBSD ou OpenBSD . Citant la page de manuel chmod (1) des spécifications de base du groupe ouvert, édition 7, édition 2018:

Le symbole X perm a été adopté par les systèmes BSD car il fournit la fonctionnalité généralement souhaitée lors de modifications récursives ( option -R ). Des fonctionnalités similaires ne sont pas fournies par l' utilitaire de recherche . Les versions BSD historiques de chmod ne prenaient toutefois en charge que X avec op +; il a été étendu dans ce volume de POSIX.1-2017 car il est également utile avec op =. (Il a également été ajouté pour op - même s'il duplique x , dans ce cas, car il est intuitif et plus facile à expliquer.)


1 man 1 chmod
2 info '(coreutils)Conditional Executability'

Cristian Ciupitu
la source
Ouais, c'est vrai, je ne pourrais jamais m'adapter au fait qu'aujourd'hui beaucoup de commandes (cp, chmod ...) ont le drapeau -R ... Il était une fois la recherche , le seul instrument pour le faire de manière récursive.
MariusMatutiae
2

Si vous voulez le faire de manière récursive, c'est -à- dire dans les répertoires d'un répertoire à l'autre, la commande à utiliser est la suivante:

 find /path/to/starting/directory -type d -exec chmod +x {} \;

Ceci localise tous les et les seuls sous-répertoires ( -type d ) du répertoire / path / to / begin / directory, puis effectue le changement requis de l'autorisation d'exécution à chacun d'entre eux. L'espace avant \; est obligatoire.

MariusMatutiae
la source
0

Avez-vous essayé quelque chose comme:

chmod +x $(ls -p | grep /), cela ajoute la permission d’exécution à seulement les répertoires

et si vous souhaitez autoriser l'exécution de fichiers et de répertoires, procédez comme suit:

chmod +x * et pour supprimer les autorisations à exécuter sur les fichiers, essayez quelque chose comme ceci:

chmod -x *.*

En espérant que ça aide

BigFoot
la source
Si vous utilisez Bash, vous */pouvez également utiliser des répertoires.
Cristian Ciupitu,
1
Veuillez ne jamais recommander l'analysels . Cela échouera même dans les cas les plus simples où les noms de répertoire contiennent des espaces.
terdon
@terdon, il y a aussi Pourquoi ne pas analyser ls?
Cristian Ciupitu
@CristianCiupitu oui, je sais. La mienne est la troisième réponse la plus votée ici :).
Terdon
D'accord, désolé alors et merci pour le conseil :)
BigFoot
0

Essaye ça:

find . -mindepth 1  -print0 | while IFS= read -r -d '' file; do
    if [ -d "$file" ]; then chmod 750 "$file";
    else chmod 640 "$file"; fi
done

Explication

  • -mindepth 1: C'est tellement findcorrespondent wont le répertoire courant, ..
  • -print0: imprime une sortie séparée par un zéro. Cela garantit que nous traitons correctement les fioles contenant des nouvelles lignes.
  • while IFS=: le réglage IFSsur la chaîne vide désactive le fractionnement des mots. Nécessaire pour les noms de fichiers / répertoires avec des espaces.
  • read -r -d '': ceci lit chaque ligne $filemais -rgarantit que nous ne traitons pas \spécialement (s'il y en a dans vos noms de fichiers) et -d ''définit le délimiteur sur la chaîne null afin que nous findanalysions correctement la sortie et que nous puissions traiter les noms de fioles contenant des nouvelles lignes.
  • if [ -d "$file" ]; then chmod 750 "$file";: Si le $fileest un répertoire ( [ -d "$file" ], définissez ses autorisations sur drwxr-x---.
  • else chmod 640 "$file"; fi: si ce n'est pas un répertoire, définissez-les sur -rw-r-----.
terdon
la source
0
chmod -R u=rwX,g=rX,o= .

La majuscule Xsignifie qu'il n'est défini que s'il est déjà défini ailleurs. Comme tous vos répertoires sont déjà exécutables pour l'utilisateur, ils seront également rendus exécutables pour les groupes. Les fichiers n'étant pas exécutables pour l'utilisateur, ils ne le seront pas non plus pour les groupes.

Utiliser chmod +Xaura à peu près le même effet, sauf que, quand il donnera les droits d’exécution, il donnera les droits d’exécution à l’utilisateur, au groupe et aux autres.

Jornane
la source
0

Merci pour les réponses. J'ai constaté que pour attribuer des autorisations d'exécution uniquement aux répertoires, il est nécessaire d'utiliser les Xautorisations majuscules .

Donc, la commande serait la suivante:

chmod -R a-rwx,u=rwX,g=rX .

http://www.manpagez.com/man/1/chmod/

(Cela m'a pris un certain temps pour trouver cela, alors je voulais partager avec tout le monde. Maintenant, je suppose que cette question sera indexée sur Google pour la prochaine personne qui veut savoir)

Daniel
la source