12 votes

Donner la permission d'exécution aux répertoires mais pas aux fichiers

J'ai une structure de répertoires avec des fichiers et des répertoires et j'aimerais attribuer des autorisations de sorte que tous les fichiers et répertoires aient des autorisations de lecture-écriture pour l'utilisateur et des autorisations de lecture pour le groupe et, en plus, des autorisations d'exécution pour 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

21voto

bene Points 2144

Pour donner le droit d'exécution (recherche) aux répertoires, mais pas aux fichiers, utilisez :

chmod -R +X .

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

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

-R modifie les fichiers et les répertoires de manière récursive, alors que +X définit execute/search seulement si le fichier est un répertoire ou a déjà la permission execute pour un certain utilisateur. r y w sont bien sûr destinés à la lecture et à l'écriture, respectivement.

Mode X ( supérieur x ) est documenté à la fois dans la version traditionnelle page de manuel 1 et le documentation info 2 .

Il devrait également fonctionner sur d'autres systèmes de type Unix, par exemple. FreeBSD , NetBSD o OpenBSD . Citant le chmod(1) page de manuel de The Open Group Base Specifications Issue 7, édition 2018 :

El X perm a été adopté sur les systèmes BSD parce qu'il fournit une fonctionnalité communément souhaitée lors de l'exécution de procédures récursives ( -R ). Une fonctionnalité similaire n'est pas fournie par le trouver utilitaire. Les versions BSD historiques de chmod Cependant, il ne supporte que X con op + ; elle a été étendue dans ce volume de POSIX.1-2017 parce qu'elle est également utile dans le cas de op \=(Il a également été ajouté pour op - même si elle fait double emploi avec x dans ce cas, parce que c'est intuitif et plus facile à expliquer).


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

2voto

MariusMatutiae Points 45233

Si vous voulez le faire de manière récursive, c'est-à-dire à des répertoires dans des répertoires dans des répertoires, la commande à utiliser est la suivante :

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

Cela permet de localiser tous et seulement les sous-répertoires ( -type d ) du répertoire /path/to/starting/directory, puis effectue le changement requis de la permission d'exécution pour chacun d'entre eux. L'espace avant \; est obligatoire.

0voto

Lundus Points 157

Avez-vous essayé quelque chose comme :

chmod +x $(ls -p | grep /) ceci ajoute la permission d'exécution pour les seuls répertoires

et si vous souhaitez donner la permission d'exécution aux fichiers et répertoires, faites simplement :

chmod +x * et pour supprimer les droits d'exécution sur les fichiers, essayez quelque chose comme ceci :

chmod -x *.*

J'espère que cela aidera

0voto

Mohsin Points 11

Essayez ç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 find ne correspond pas au répertoire actuel, . .
  • -print0 : imprime une sortie non séparée. Ceci assure que nous traitons correctement les fioles contenant des nouvelles lignes.
  • while IFS= : réglage IFS à la chaîne vide désactive la séparation des mots. Nécessaire pour les noms de fichiers/répertoires avec des espaces.
  • read -r -d '' ce qui permet de lire chaque ligne dans $file mais le -r s'assure que nous ne traitons pas \ spécialement (au cas où il y en aurait dans vos noms de fichiers) et -d '' fixe le délimiteur à la chaîne de caractères nulle, de sorte que nous analysons la sortie de find correctement et peut traiter les noms de fiole contenant des nouvelles lignes.
  • if [ -d "$file" ]; then chmod 750 "$file"; : Si le $file est un répertoire ( [ -d "$file" ] et de définir ses permissions à drwxr-x--- .
  • else chmod 640 "$file"; fi : s'il ne s'agit pas d'un répertoire, mettez-les à -rw-r----- .

0voto

jornane Points 1055
chmod -R u=rwX,g=rX,o= .

La majuscule X signifie qu'elle n'est définie que si elle est déjà définie ailleurs. Puisque tous vos répertoires sont déjà exécutables pour l'utilisateur, ils seront également rendus exécutables pour les groupes. Puisque les fichiers ne sont pas exécutables pour l'utilisateur, ils ne seront pas non plus rendus exécutables pour les groupes.

Utilisation de chmod +X aura à peu près le même effet, sauf que, lorsqu'il donne des droits d'exécution, il donnera des droits d'exécution à user, group et other.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X