Comment puis-je modifier les autorisations d'un dossier et de tous ses sous-dossiers et fichiers en une seule étape sous Linux? [fermé]

1807

Je souhaite modifier les autorisations d'un dossier et de tous ses sous-dossiers et fichiers en une seule étape (commande) sous Linux.

J'ai déjà essayé la commande ci-dessous mais elle ne fonctionne que pour le dossier mentionné:

chmod 775 /opt/lampp/htdocs

Existe-t-il un moyen de définir chmod 755pour l' /opt/lampp/htdocsensemble de son contenu, y compris les sous-dossiers et les fichiers?

De plus, à l'avenir, si je crée un nouveau dossier ou fichier à l'intérieur htdocs, comment définir automatiquement les autorisations de celui-ci 755?

J'ai aussi regardé ce lien:

http://stackoverflow.com/questions/3740187/how-to-set-default-chmod-in-linux-terminal

Adam
la source
4
Aviez-vous l'intention d'écrire chmod 75 /opt/lampp/htdocsou est-ce vraiment le cas chmod 755 /opt/lampp/htdocs?
HelloGoodbye
234
Le fait que la 4ème question la plus votée sur Linux soit "fermée comme hors sujet" est hilarant. Qui d'autre qu'un programmeur se soucierait de chmod? Comment est-ce hors sujet? Pourquoi les "autorisations", "dossiers" et "cmod" sont-ils même des balises si elles sont hors sujet?
Arthur Dent
8
@ArthurDent, car cette question (bien que parfaitement valide et utile) est plus adaptée à un site SE axé sur le système, tel que SuperUser ou ServerFault. Ce n'est pas expressément lié à la programmation.
timelmer
26
@timelmer Bien sûr, mais je demande à nouveau pourquoi les balises "permissions", "dossier" et "cmod"? Quand cmod serait-il utilisé «expressément» pour la programmation?
Arthur Dent
9
Si vous voulez devenir vraiment difficile, Bash est en fait un langage de script, mais il en va de même pour php, ce qui ne semble pas déranger.
timelmer

Réponses:

2959

Les autres réponses sont correctes, en ce sens chmod -R 755qu'elles définiront ces autorisations pour tous les fichiers et sous-dossiers de l'arborescence. Mais pourquoi diable voudriez-vous ? Cela peut avoir un sens pour les répertoires, mais pourquoi définir le bit d'exécution sur tous les fichiers?

Je soupçonne que ce que vous voulez vraiment faire est de définir les répertoires sur 755 et de laisser les fichiers seuls ou de les définir sur 644. Pour cela, vous pouvez utiliser la findcommande. Par exemple:

Pour changer tous les répertoires en 755 ( drwxr-xr-x):

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Pour changer tous les fichiers en 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
WombleGoneBad
la source
231
Quelqu'un {} \;veut-il expliquer ce que signifie la fin de la ligne?
Nilzor
307
@Nilzor chmod 644 {} \;spécifie la commande qui sera exécutée par findpour chaque fichier. {}est remplacé par le chemin du fichier et le point-virgule indique la fin de la commande (échappé, sinon il serait interprété par le shell au lieu de find).
tobbez
25
"mais pourquoi définir le bit d'exécution sur tous les fichiers" Pourquoi pas? Je suis nouveau sur Ubuntu / Linux ...
FlavorScape
12
@FlavorScape Womble définit le bit d'exécution exclusivement sur les répertoires renvoyés par find. L'autorisation d'exécution sur un répertoire permet à une classe d'utilisateurs de répertorier le contenu de ce répertoire et de s'y insérer. De manière générale, vous voulez que r et x sur un répertoire soient accessibles à vous, même s'il peut y avoir d'étranges cas extrêmes où vous ne définiriez que l'un ou l'autre. Voir ce guide pour plus d'informations: nixsrv.com/llthw/ex23
Alexandr Kurilin
25
À l'exception de sleepynate, chaque réponse a négligé d'aborder l'aspect de sa question concernant la définition des autorisations pour les fichiers / dossiers créés à l' avenir .
JGarrido
781

Cochez l'option -R

chmod -R <permissionsettings> <dirname>

À l'avenir, vous pouvez gagner beaucoup de temps en consultant d'abord la page de manuel:

man <command name>

Donc dans ce cas:

man chmod
Steve Robillard
la source
147
qu'est ce que c'est man?
Adam
36
il représente la page de manuel et est une commande linux qui affiche la page de manuel d'une commande (la plupart des commandes linux ont une page de manuel). essayez man ls ou man man.
Steve Robillard
8
Cela n'a pas fonctionné pour moi dans le Terminal de Mac OS X. Là, j'ai fait "chmod -R <permissionsettings> <dirname> *" et cela a fonctionné.
Einar Ólafsson
127
Je pense que maintenant, il est en fait plus rapide de publier ici ou d'utiliser Google que d'utiliser man. En particulier pour quelque chose comme grepoù, si vous êtes nouveau, manil peut être très long de localiser des exemples dans le document, mais Google ou SO fournissent des exemples en quelques secondes.
ely
17
Pour mémoire, ceux qui ne connaissent pas Linux peuvent ne pas être familiers avec l'homme. Je ne connais que son existence, mais essayer de comprendre comment l'utiliser nécessiterait une aventure google en soi. Peut-être une entreprise valable, mais vous devez vous rendre compte que j'ai trouvé CE TRÈS post via Google et qu'il a répondu à la question EXACTE que je posais. Ressources, mon ami. Les ressources sont inestimables. Et vous pensez peut-être que c'était inutile et qu'il aurait dû juste vérifier l'homme, mais cela m'a aidé et des centaines d'autres (des milliers même). Veuillez donc considérer cela.
Soundfx4
391

Si vous souhaitez définir des autorisations sur tous les fichiers a+ret sur tous les répertoires a+x, et le faire de manière récursive dans l'arborescence complète du sous-répertoire, utilisez:

chmod -R a+rX *

Le X(c'est-à-dire capital X, pas petit x!) Est ignoré pour les fichiers (sauf s'ils sont déjà exécutables pour quelqu'un déjà) mais est utilisé pour les répertoires.

Pete
la source
27
Très bonne réponse. Notez simplement que * ne correspondra pas aux fichiers cachés (noms commençant par un point). Il peut alors être plus judicieux d'utiliser. (pour le répertoire courant).
Aaron Adams
21
Ceci est la bonne réponse. Pour mon cas, je voulais définir tous les répertoires sur 775 et tous les fichiers sur 664 . @ L'excellente réponse de Pete m'a conduit à la chmoddocumentation, où j'ai compris que je pouvais l'utiliser chmod -R g+wX .. Bravo!
chadoh
8
Cela ne supprimera pas les xfichiers s'ils l'ont déjà.
Benoit Duffez
5
Dans le cas où ce n'est pas tout à fait clair, X majuscule signifie "rendre tous les répertoires exécutables" (mais pas les fichiers).
Matt Browne
4
@BenoitDuffez si votre objectif est de supprimer également le bit exécutable des fichiers, vous pouvez combiner des directives, comme "a-x + rX" pour supprimer "x" de tout, puis définir "r" pour tout et "x" pour les répertoires uniquement .
nunks
144

Vous pouvez utiliser -Ravec chmodpour une traversée récursive de tous les fichiers et sous-dossiers.

Vous pourriez avoir besoin de sudo car cela dépend de l' installation de LAMP par l'utilisateur actuel ou un autre:

sudo chmod -R 755 /opt/lampp/htdocs
ravi ranjan
la source
17
D'une manière ou d'une autre, cela sudo chmod 755 -R /directoryn'a pas fonctionné mais sudo chmod -R 755 /directorya fonctionné. Bizarre. J'utilise Mac OS X d'ailleurs.
lomse
8
C'est correct dans mon expérience. Le drapeau doit apparaître directement après chmod, pas n'importe où dans la chaîne.
orionrush
1
La commande écrite ci-dessus est erronée. La commande récursive correcte est: sudo chmod -R 755 / opt / lampp / htdocs Remarque: -R devrait être avant 755
Sandip Patel - SM
Cette solution fonctionne bien pour Redhat. Merci!
Lavande
A bien fonctionné sur RHEL et a sudo chmod 755 -Rfonctionné
AnBisw
79

La commande récursive correcte est:

sudo chmod -R 755 /opt/lampp/htdocs

-R: changer chaque sous-dossier, y compris le dossier actuel

Pramendra Gupta
la source
1
Salut, vous êtes sûr du dossier actuel, vous en êtes un malgré le chemin?
shareef
UTILISATION OSX: sudo chmod 777 logs / -R OBTENIR: chmod: -R: Aucun fichier ou répertoire NE DEVRAIT ÊTRE: sudo chmod -R 777 logs /
elad silver
76

Pour définir tous les sous-dossiers (récursivement), utilisez -R

chmod 755 /folder -R

Et utilisez umask pour définir la valeur par défaut sur les nouveaux dossiers / fichiers cd / dossier umask 755

Topera
la source
24
NE PAS régler votre umask755! Vous ne pourrez pas lister, lire ou utiliser les fichiers ou répertoires que vous créez!
sleepynate
14
Voulez-vous dire umask 022?
Xkeeper
4
cela définit tous à 755, y compris les fichiers.!
Patrick Mutwiri
@sleepynate De quoi parlez-vous? 755 signifie que le propriétaire peut lire, écrire et exécuter, et que tous les autres utilisateurs peuvent lire et exécuter, mais pas écrire sur l'objet
svin83
2
@NicHartley @ svin83 umask est les bits qui seront masqués des autorisations, c'est donc effectivement l'inverse de chmod. λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
sleepynate
51

chmod 755 -R /opt/lampp/htdocsdéfinira récursivement les autorisations. Il n'y a aucun moyen de définir automatiquement les autorisations pour les fichiers uniquement dans ce répertoire qui sont créés après avoir défini les autorisations, mais vous pouvez modifier vos autorisations de fichiers par défaut à l'échelle du système avec en définissant umask 022.

endormi
la source
9
La réponse de sleepynate est la SEULE bonne. L'affiche posait deux questions: 1) comment puis-je corriger les autorisations sur les fichiers et les dossiers, et 2) comment modifier les paramètres par défaut (c'est-à-dire les "futurs" fichiers). Comme l'a dit Nate, le premier est avec "chmod", et le second avec "umask". J'ajouterais également qu'il n'y a AUCUNE FAÇON de changer umask sur un seul répertoire ... umask est "tout ou rien" par utilisateur. Cependant rien ne vous empêche de créer un nouvel utilisateur, qui partage des groupes avec vous, afin que vous pouvez juste sudo -u someuser [créer un fichier] »C'est pensée en dehors de la boîte un peu, mais il est une solution fine..
Scott Prive
Je pense que vous avez raison, mais ne peut pas inheritêtre une solution à de nombreux cas ou fonctionnera-t-il exclusivement avec NTFS-3G?
Sebastian Schlicht
sans donner l'autorisation aux dossiers peuvent être créés à l'avenir, il se peut que l'on ne puisse pas copier un dossier, par exemple myforlderdepuis d'autres endroits (comme un PC) vers ce répertoire cible (sur un serveur) car il essaiera de créer un nouveau dossier dans le répertoire cible dont le nom myfolder n'est pas autorisé à le faire. Comme je l'ai root, j'utilise juste chown -R username:usergroup /directory.
Jason Goal
27

Vous voudrez peut-être considérer cette réponse donnée par nik sur superutilisateur et utiliser "un chmod" pour tous les fichiers / dossiers comme celui-ci:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Iam Zesh
la source
9
Attention, il est facile de se heurter aux limites de la ligne de commande.
Lothar
1
J'ai cette erreur: -bash: / bin / chmod: Liste d'arguments trop longue
Oleg Abrazhaev
Il serait préférable d'utiliser l' -execoption findafin de surmonter l' Argument list too longerreur.
miravalls
Connexes: Modifiez toutes les autorisations de dossier avec une seule commande chez U & L.
G-Man dit «Réinstalle Monica»
20

Utilisation:

sudo chmod 755 -R /whatever/your/directory/is

Cependant, soyez prudent avec cela. Cela peut vraiment vous blesser si vous modifiez les autorisations des mauvais fichiers / dossiers.

Nate Starner
la source
20

Voici une autre façon de définir les répertoires sur 775 et les fichiers sur 664.

find /opt/lampp/htdocs \
\( -type f -exec chmod ug+rw,o+r {} \; \) , \
\( -type d -exec chmod ug+rwxs,o+rx {} \; \)

Cela peut sembler long, mais c'est plutôt cool pour trois raisons:

  1. Analyse le système de fichiers une seule fois plutôt que deux fois.
  2. Fournit un meilleur contrôle sur la façon dont les fichiers sont traités par rapport à la façon dont les répertoires sont gérés. Ceci est utile lorsque vous travaillez avec des modes spéciaux tels que le sticky bit , que vous souhaitez probablement appliquer aux répertoires mais pas aux fichiers.
  3. Utilise une technique tout droit sortie des manpages (voir ci-dessous).

Notez que je n'ai pas confirmé la différence de performance (le cas échéant) entre cette solution et celle d'utiliser simplement deux commandes find (comme dans la solution de Peter Mortensen). Cependant, voir un exemple similaire dans le manuel est encourageant.

Exemple de man findpage:

find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)

Traverse the filesystem just once, listing setuid files and  direc‐
tories into /root/suid.txt and large files into /root/big.txt.

À votre santé

chrisfargen
la source
Maintenant, comment transformer cela dans un script shell afin que nous puissions exécuter le dossier openmod $?
StR
Les gens, veuillez utiliser xargs. Il enregistre des milliers d'appels de processus.
seanahern
13

chmod -R 755 directory_namefonctionne, mais comment garderiez-vous également les nouveaux fichiers au 755? Les autorisations du fichier deviennent l'autorisation par défaut.

Sanchit Gupta
la source
Je l'ai fait mais je ne peux pas ouvrir le terminal à partir de là. Je ne peux pas le réparer.
Kavindu Gayantha
9

Pour Mac OS X 10.7 (Lion), c'est:

chmod -R 755 /directory

Et oui, comme tous les autres disent, soyez prudent lorsque vous faites cela.

wmartin
la source
9

Vous voulez vous assurer que les fichiers et répertoires appropriés sont chmod-ed / les autorisations pour ceux-ci sont appropriées. Pour tous les répertoires que vous souhaitez

find /opt/lampp/htdocs -type d -exec chmod 711 {} \;

Et pour toutes les images, JavaScript, CSS, HTML ... eh bien, vous ne devriez pas les exécuter. Alors utilisez

chmod 644 img/* js/* html/*

Mais pour tout le code logique (par exemple le code PHP), vous devez définir des autorisations telles que l'utilisateur ne puisse pas voir ce code:

chmod 600 file
NikolaiDante
la source
6

Je pense qu'Adam demandait comment changer la valeur umask pour tous les processus qui tentent de fonctionner sur le /opt/lampp/htdocsrépertoire.

Le masque du mode de création de fichier utilisateur (umask) est utilisé pour déterminer l'autorisation de fichier pour les fichiers nouvellement créés. Il peut être utilisé pour contrôler l'autorisation de fichier par défaut pour les nouveaux fichiers.

donc si vous allez utiliser une sorte de programme ftp pour télécharger des fichiers, /opt/lampp/htdocsvous devez configurer votre serveur ftp pour utiliser umask que vous voulez.

Si des fichiers / répertoires sont créés par exemple par php, vous devez modifier le code php

<?php
umask(0022);
// other code
?>

si vous créez de nouveaux fichiers / dossiers à partir de votre session bash, vous pouvez définir la valeur umask dans votre profil shell ~ / .bashrc Ou vous pouvez configurer umask dans /etc/bashrcou /etc/profilefichier pour tous les utilisateurs. ajoutez ce qui suit au fichier: umask 022

Sample umask Values and File Creation Permissions
If umask value set to   User permission     Group permission     Others permission
000                         all              all                   all
007                         all              all                   none
027                         all          read / execute            none

Et pour modifier les autorisations pour les fichiers déjà créés, vous pouvez utiliser find. J'espère que cela t'aides.

Viktor
la source
4

Il existe deux réponses pour rechercher des fichiers et les appliquer chmod. Le premier est findle fichier et l'appliquer chmodtel qu'il le trouve (comme suggéré par @WombleGoneBad).

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

La deuxième solution consiste à générer la liste de tous les fichiers avec la findcommande et à fournir cette liste à la chmodcommande (comme suggéré par @lamgesh).

chmod 755 $(find /path/to/base/dir -type d)

Ces deux versions fonctionnent bien tant que le nombre de fichiers renvoyés par la findcommande est petit. La deuxième solution est superbe et plus lisible que la première. S'il y a un grand nombre de fichiers, la deuxième solution renvoie une erreur:Argument list too long.

Donc, ma suggestion est

  1. À utiliser chmod -R 755 /opt/lampp/htdocssi vous souhaitez modifier simultanément les autorisations de tous les fichiers et répertoires.
  2. À utiliser find /opt/lampp/htdocs -type d -exec chmod 755 {} \;si le nombre de fichiers que vous utilisez est très important. L' -type xoption recherche uniquement le type de fichier spécifique, où d est utilisé pour trouver le répertoire, f pour le fichier et l pour le lien.
  3. Utiliser chmod 755 $(find /path/to/base/dir -type d)autrement
  4. Mieux vaut utiliser le premier dans n'importe quelle situation
Prabhu
la source
2

C'est très simple.

Dans Terminal, accédez au gestionnaire de fichiers. exemple: sudo nemo. Allez /opt/puis cliquez sur Propriétés → Autorisation . puis Autre . Enfin, changez pour créer et supprimer et déposez un accès pour lire et écrire et cliquez sur le bouton Appliquer ... Et travaillez.

Debian.
la source
qu'est-ce que sudo nemo?
Vikranth Inti