Comment modifier les autorisations de fichier pour un répertoire en une seule commande


11

Comment puis-je modifier toutes les autorisations de fichier d'un répertoire dans une seule commande sous Unix?


Voulez-vous dire que vous souhaitez modifier les autorisations pour tous les fichiers du répertoire? Souhaitez-vous que cela aille également dans les répertoires imbriqués? Souhaitez-vous modifier les autorisations du ou des répertoires lui-même, ou uniquement les fichiers à l'intérieur? Enfin, avez-vous essayé de rechercher ce site avant de poster votre question?
Ether

Réponses:


21

Pour modifier les autorisations sur un fichier ou une entrée de répertoire de manière non récursive, utilisez la chmodcommande (voir man chmod pour en savoir plus sur ses options spécifiques):

chmod +x dir  # Set a directory to be listable
chmod +x file # Set a file to be executable

Pour changer le propriétaire d'un fichier / répertoire de manière récursive (affectant tous les descendants):

chown -R username           dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group

Pour modifier les bits d'autorisation de tous les fichiers d'un répertoire, de manière récursive:

find dir -type f -exec chmod 644 {} ';' # make all files       rw-r-r-

Pour modifier les bits d'autorisation de tous les répertoires:

find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x

Ce serait bien si vous pouviez simplement faire ceci:

chmod -R 755 dir

Cependant, cela a des problèmes. Il traite les fichiers et répertoires de la même manière. La commande ci-dessus rend les répertoires lisibles et lisibles par tous les utilisateurs, mais elle rend également tous les fichiers exécutables, ce qui est généralement ce que vous ne voulez pas faire.

Si nous le changeons en 644, nous obtenons un autre problème:

$ chmod -R 644 x2
chmod: cannot access `x2/authors.html': Permission denied
chmod: cannot access `x2/day_of_week.plot': Permission denied
chmod: cannot access `x2/day_of_week.dat': Permission denied
chmod: cannot access `x2/commits_by_year.png': Permission denied
chmod: cannot access `x2/index.html': Permission denied
chmod: cannot access `x2/commits_by_year.plot': Permission denied
chmod: cannot access `x2/commits_by_year_month.plot': Permission denied
chmod: cannot access `x2/files_by_date.png': Permission denied
chmod: cannot access `x2/files.html': Permission denied
...

Le problème est que 644le bit de liste de répertoires est supprimé, et cet effet secondaire empêche une nouvelle traversée de l'arborescence des fichiers. Vous pouvez contourner ce problème en utilisant sudo, mais vous vous retrouvez toujours avec des répertoires qui sont complètement inutiles pour les utilisateurs non root.

Le fait est que cela chmod -Rfonctionne très bien dans certains cas (par exemple chmod -R g-r), mais pas dans les cas où vous voulez jouer avec le -xbit, car il fonctionne sans discernement sur les fichiers et les répertoires.


Pourquoi supposez-vous qu'il veut définir 644ou qu'il définit -xdes répertoires? La question stipule seulement qu'il veut changer les autorisations, pas à quoi en particulier.
Reese Moore

@Reseese Moore: Vous avez raison. Le demandeur n'a même rien dit sur la modification récursive des autorisations.
Joey Adams

1
Vous voulez généralement utiliser le mode symbolique + et - pour cela; c'est-à-direchmod -R go=u,go-w /dir
dannysauer

6

chmoda un -Rindicateur qui signifie de modifier les autorisations sur les fichiers et répertoires de manière récursive.

Vous pouvez utiliser le majuscule 'X' pour faire la bonne chose pour les dossiers: 'X' = "exécuter / rechercher uniquement si le fichier est un répertoire ou a déjà l'autorisation d'exécution pour un utilisateur"

Ainsi, par exemple: chmod -R ug = rwX, o-rwx.

Rendrait un arbre entier accessible au propriétaire et au groupe de chaque fichier, et non accessible à quiconque. Tout fichier déjà exécutable serait toujours exécutable par la suite, et tous les répertoires auraient le «x» pour l'utilisateur et le groupe et pas pour les autres.


Essayez chmod -R 444 somedirun répertoire contenant des fichiers. Vous obtenez Permission deniedparce que l'indicateur -x est retiré des répertoires et qu'il est nécessaire de continuer à lire le répertoire.
Joey Adams

1
Un complément utile à cela est la syntaxe X = Y. Vous pouvez par exemple définir des autorisations de groupe sur l'autorisation d'utilisateur à l'aide de chmod -R g = u dir pour définir l'équivalent de groupe et d'utilisateur. Cela fonctionne autour de choses comme les répertoires qui nécessitent un exécutable alors que les fichiers "simples" n'en ont pas.
Paul Rubel

3
chmod -R <file permission> *

À partir de la page de manuel de chmod:

-R, --recursive
              change files and directories recursively

Utilisez chmodavec le -Rcommutateur pour plusieurs directions qui a une arborescence de sous-répertoires contenant des millions de fichiers à l'intérieur et vous souhaitez modifier les autorisations de fichiers de ces fichiers en une seule fois.

L'autorisation de fichier peut être par exemple pour. 777, 755, 644 etc.

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.