Comment puis-je modifier toutes les autorisations de fichier d'un répertoire dans une seule commande sous Unix?
Comment puis-je modifier toutes les autorisations de fichier d'un répertoire dans une seule commande sous Unix?
Réponses:
Pour modifier les autorisations sur un fichier ou une entrée de répertoire de manière non récursive, utilisez la chmod
commande (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 644
le 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 -R
fonctionne très bien dans certains cas (par exemple chmod -R g-r
), mais pas dans les cas où vous voulez jouer avec le -x
bit, car il fonctionne sans discernement sur les fichiers et les répertoires.
644
ou qu'il définit -x
des répertoires? La question stipule seulement qu'il veut changer les autorisations, pas à quoi en particulier.
chmod -R go=u,go-w /dir
chmod
a un -R
indicateur 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.
chmod -R 444 somedir
un répertoire contenant des fichiers. Vous obtenez Permission denied
parce que l'indicateur -x est retiré des répertoires et qu'il est nécessaire de continuer à lire le répertoire.
chmod -R <file permission> *
À partir de la page de manuel de chmod
:
-R, --recursive
change files and directories recursively
Utilisez chmod
avec le -R
commutateur 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.