Comment créer un répertoire et donner l'autorisation en une seule commande

108

Comment créer un répertoire et donner la permission en une seule commande sous Linux?

Je dois créer beaucoup de dossier avec la permission complète 777.

Commandes

mkdir path/foldername
chmod 777 path/foldername 

Je n'aime pas créer et donner la permission dans deux commandes. Puis-je faire cela en une seule commande?

pauvre
la source
1
mkdir temp; chmod 777 tempest une ligne. Vous pouvez faire de «temp» une variable et l'enregistrer en tant que commande bash. Est-ce ce que vous cherchez à faire?
styfle
1
salut @ white-rose, s'il vous plaît voir la dernière réponse, cela devrait être la réponse acceptée. bonus, il combine mkdir, chmod ET chown en une seule balle!
Costin Gușă

Réponses:

205

Selon la page de manuel de mkdir ...

mkdir -m 777 dirname
Alex
la source
1
Pouvez-vous me parler de l'option -m?
poorani
L'option @Whiterose -m est pour le mode. Définit les bits d'autorisation pour les répertoires nouvellement créés sur la valeur spécifiée par la variable Mode. La variable Mode prend les mêmes valeurs que le paramètre Mode de la commande chmod, sous forme symbolique ou numérique.
TMKasun
15
mkdir -p -m est interrompu, car le mode n'est appliqué qu'au dernier répertoire du chemin que vous tapez. Par exemple, mkdir -p -m 707 un / deux / trois. Même si les trois répertoires sont nouvellement créés, seul le dernier aura les autorisations demandées, et les autres, par défaut. install -d -m est cassé de la même manière.
Afficher le nom
À côté du problème autour de -p@DisplayName déjà mentionné ci-dessus, il y en a aussi un autre. Le -mne s'appliquera que si un répertoire est réellement créé. S'il existe déjà, son mode ne sera pas modifié. Selon votre contexte, cela peut être bon ou mauvais.
Adam Badura
1
mkdir -m777 répertoire
Hugo Deiró
19
install -d -m 0777 /your/dir

devrait vous donner ce que vous voulez. Sachez que chaque utilisateur a le droit d'écrire des fichiers d'ajout et de suppression dans ce répertoire.

Markus W Mahlberg
la source
1
bonus, vous pouvez aussi ajouter -g et / ou -o et vous pouvez avoir mkdir, chmod et chown en un seul coup!
Costin Gușă
4
C'est cassé. installez -d -m 070 un / deux / trois. Même si les trois répertoires du chemin sont nouvellement créés, seul le dernier aura le jeu d'autorisations demandé. mkdir -p -m est cassé de la même manière.
Afficher le nom
@DisplayName: qui définit néanmoins les permissions correctes pour three, les permissions par défaut étant suffisantes pour le chemin d'accès.
Markus W Mahlberg
17

Lorsque le répertoire existe déjà:

mkdir -m 777 /path/to/your/dir

Lorsque le répertoire n'existe pas et que vous souhaitez créer les répertoires parents:

mkdir -m 777 -p /parent/dirs/to/create/your/dir
Pedro Trujillo
la source
Cela ne donnera la permission 777 au sous-répertoire final. Comment puis-je faire cela et donner la permission 777 à tous les répertoires parents également?
Levi Johansen
2
Je n'ai pas de réponse à cela mais je crois que la réponse est ici: stackoverflow.com/questions/3740152/…
Pedro Trujillo
Notez que cette commande consiste à résoudre ce problème "Comment créer un répertoire et donner l'autorisation en une seule commande". Je crois que la solution à votre question sera quelque chose comme:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo
10

IMO, il est préférable d'utiliser la installcommande dans de telles situations. J'essayais de rendre systemd-journaldpersistant à travers les redémarrages.

install -d  -g systemd-journal -m 2755 -v /var/log/journal
Badi
la source
7

Vous pouvez écrire un script shell simple, par exemple:

#!/bin/bash
mkdir "$1"
chmod 777 "$1"

Une fois enregistré et l'indicateur exécutable activé, vous pouvez l'exécuter à la place de mkdir et chmod:

./scriptname path/foldername

Cependant, la réponse d'Alex est bien meilleure car elle engendre un processus au lieu de trois. Je ne connaissais pas l' -moption.

Delan Azabani
la source
Merci delan .. Je suis également écrit cette commande dans le script shell .. Mais je veux faire en une seule commande.
poorani
7

Juste pour développer et améliorer certaines des réponses ci-dessus:

Tout d'abord, je vais vérifier la page de manuel mkdir pour GNU Coreutils 8.26 - elle nous donne ces informations sur les options '-m' et '-p' (peut également être donnée comme --mode = MODE et --parents, respectivement ):

... set [s] mode de fichier (comme dans chmod), pas a = rwx - umask

... aucune erreur si existante, créez des répertoires parents si nécessaire

Les déclarations sont vagues et peu claires à mon avis. Mais fondamentalement, cela dit que vous pouvez créer le répertoire avec les permissions spécifiées par "chmod numeric notation" (octals) ou vous pouvez aller "dans l'autre sens" et utiliser un / votre umask.

Note latérale: je dis "dans l'autre sens" car la valeur umask est en fait exactement ce à quoi elle ressemble - un masque , masquant / supprimant les permissions plutôt que de les "accorder" comme avec la notation octale numérique de chmod.

Vous pouvez exécuter la commande shell-builtin umaskpour voir ce qu'est votre umask à 3 chiffres; pour moi, c'est 022. Cela signifie que lorsque mkdir yodirectoryj'exécute dans un dossier donné (par exemple, mahome) et statque j'obtiens une sortie ressemblant à ceci:

               755                   richard:richard         /mahome/yodirectory
 #          permissions                 user:group      what I just made (yodirectory),
 # (owner,group,others--in that order)                 where I made it (i.e. in mahome)
 # 

Maintenant, pour ajouter un tout petit peu plus sur ces autorisations octales. Lorsque vous créez un répertoire, "votre système" prend vos perms de répertoire par défaut '[qui s'applique aux nouveaux répertoires (sa valeur devrait 777)] et claque sur votre masque (u), cachant effectivement certaines de ces perms'. Mon umask est 022 - maintenant si nous "soustrayons" 022 de 777 (techniquement soustraire est une simplification excessive et pas toujours correcte - nous désactivons en fait les perms ou le masque les ing) ... nous obtenons 755 comme indiqué (ou « statted » ) plus tôt.

Nous pouvons omettre le '0' devant les octals à 3 chiffres (ils ne doivent donc pas être à 4 chiffres) car dans notre cas, nous ne voulions (ou plutôt n'avons pas mentionné) de stickybits, setuids ou setgids (vous voudrez peut-être examiner ceux-ci, au fait, ils pourraient être utiles puisque vous allez 777). Donc, en d'autres termes, 0777 implique (ou équivaut à) 777 (mais 777 n'est pas nécessairement équivalent à 0777 - puisque 777 ne spécifie que les permissions, pas les setuids, setgids, etc.)

Maintenant, pour appliquer cela à votre question dans un sens plus large - vous avez (déjà) quelques options. Toutes les réponses ci-dessus fonctionnent (du moins selon mes coreutils). Mais vous pouvez (ou êtes assez susceptible de) rencontrer des problèmes avec les solutions ci-dessus lorsque vous souhaitez créer des sous répertoires (répertoires imbriqués) avec des autorisations 777 en même temps. Plus précisément, si je fais ce qui suit dans mahome avec un umask de 022:

mkdir -m 777 -p yodirectory/yostuff/mastuffinyostuff
# OR (you can swap 777 for 0777 if you so desire, outcome will be the same)
install -d -m 777 -p yodirectory/yostuff/mastuffinyostuff

Je vais obtenir des permanentes 755pour les deux yodirectoryet yostuff, avec uniquement des 777permanentes pour mastuffinyostuff. Il semble donc que umaskc'est tout ce qui est giflé yodirectoryet yostuff... pour contourner cela, nous pouvons utiliser un sous-shell:

( umask 000 && mkdir -p yodirectory/yostuff/mastuffinyostuff )

et c'est tout. 777 permanentes pour yostuff, mastuffinyostuff et yodirectory.

YenForYang
la source
7

vous pouvez utiliser la commande suivante pour créer un répertoire et donner des autorisations en même temps

mkdir -m777 path/foldername 
Omer Gafar
la source
1
il n'y a pas d'espace entre -m et 777
Omer Gafar
1

Ne pas faire: mkdir -m 777 -p a/b/c car cela ne définira que l'autorisation777 sur le dernier répertoire, c; a et b seront créés avec l'autorisation par défaut de votre umask.

Au lieu de créer de nouveaux répertoires avec autorisation 777, exécutez mkdir -pdans un sous-shell où vous remplacez le umask:

(umask u=rwx,g=rwx,o=rwx && mkdir -p a/b/c)

Notez que cela ne modifiera pas les autorisations si l'un des éléments a, b et c existe déjà.

John Mellor
la source
Oui, si vous passez un umask à 4 chiffres, le premier chiffre doit toujours être zéro (bien que vous puissiez l'omettre). Cela peut être pour la symétrie avec chmod, où le premier chiffre octal définit les bits setuid, setgid et sticky, mais si c'est le cas, c'est plutôt inutile car umask ne vous permet pas de les restreindre.
John Mellor le