Cómo crear un directorio y dar permiso en un solo comando


107

¿Cómo crear un directorio y dar permiso en un solo comando en Linux?

Tengo que crear muchas carpetas con todos los permisos 777.

Comandos

mkdir path/foldername
chmod 777 path/foldername 

No me gusta crear y dar permiso en dos comandos. ¿Puedo hacer esto con un solo comando?


1
mkdir temp; chmod 777 tempes una línea. Puede convertir 'temp' en una variable y guardarla como un comando bash. ¿Es esto lo que estás buscando hacer?
styfle

1
hola @ rosa blanca, consulte la última respuesta, debería ser la respuesta aceptada. bono, combina mkdir, chmod Y chown en una sola bala!
Costin Gușă

Respuestas:


205

Según la página de manual de mkdir ...

mkdir -m 777 dirname

1
¿Puedes hablarme sobre la opción -m?
poorani

La opción @Whiterose -m es para Mode. Establece los bits de permiso para los directorios recién creados en el valor especificado por la variable Mode. La variable Mode toma los mismos valores que el parámetro Mode para el comando chmod, ya sea en forma simbólica o numérica.
TMKasun

14
mkdir -p -m está roto, ya que el modo solo se aplica al último directorio en la ruta que escribe. Por ejemplo, mkdir -p -m 707 uno / dos / tres. Incluso si los tres directorios son nuevos, solo el último tendrá los permisos solicitados y los demás, predeterminados. install -d -m está roto de la misma manera.
Nombre para mostrar

Además del problema en torno a -pese @DisplayName ya mencionado anteriormente, también hay otro. Se -maplicará solo si se crea realmente un directorio. Si ya existe, su modo no se cambiará. Dependiendo de su contexto, esto puede ser bueno o malo.
Adam Badura

1
directorio mkdir -m777
Hugo Deiró 21/11/18

19
install -d -m 0777 /your/dir

debería darte lo que quieres. Tenga en cuenta que todos los usuarios tienen derecho a escribir, agregar y eliminar archivos en ese directorio.


1
bono, también puede agregar -g y / o -o y puede tener mkdir, chmod y chown en una sola toma.
Costin Gușă

4
Esta roto. install -d -m 070 uno / dos / tres. Incluso si los tres directorios de la ruta son nuevos, solo el último tendrá los permisos solicitados establecidos. mkdir -p -m se rompe de la misma manera.
Nombre para mostrar

@DisplayName: que, sin embargo, establece los permisos correctos para three, siendo los permisos predeterminados suficientes para la ruta.
Markus W Mahlberg

16

Cuando el directorio ya existe:

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

Cuando el directorio no existe y desea crear los directorios principales:

mkdir -m 777 -p /parent/dirs/to/create/your/dir

Esto solo dará permiso 777 al subdirectorio final. ¿Cómo puedo hacer esto y dar permiso 777 a todos los directorios principales también?
Levi Johansen

1
No tengo una respuesta para esto, pero creo que la respuesta está aquí: stackoverflow.com/questions/3740152/…
Pedro Trujillo

Tenga en cuenta que este comando es para resolver este problema "Cómo crear un directorio y dar permiso en un solo comando". Creo que la solución a tu pregunta será algo como:find /your/dirs -type d -exec chmod 755 {} \;
Pedro Trujillo

10

En mi opinión, es mejor usar el installcomando en tales situaciones. Estaba tratando de hacer systemd-journaldpersistente entre reinicios.

install -d  -g systemd-journal -m 2755 -v /var/log/journal

7

Podría escribir un script de shell simple, por ejemplo:

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

Una vez guardado y habilitado el indicador ejecutable, puede ejecutarlo en lugar de mkdir y chmod:

./scriptname path/foldername

Sin embargo, la respuesta de Alex es mucho mejor porque genera un proceso en lugar de tres. No conocía la -mopción.


Gracias delan .. También escribí ese comando en un script de shell .. Pero quiero hacerlo en un solo comando.
poorani

7

Solo para ampliar y mejorar algunas de las respuestas anteriores:

Primero, verificaré la página de manual de mkdir para GNU Coreutils 8.26; nos brinda esta información sobre la opción '-m' y '-p' (también se pueden dar como --mode = MODE y --parents, respectivamente ):

... establece el modo de archivo [s] (como en chmod), no a = rwx - umask

... no hay error si existe, cree directorios principales según sea necesario

Las declaraciones son vagas y poco claras en mi opinión. Pero básicamente, dice que puede crear el directorio con permisos especificados por "notación numérica chmod" (octales) o puede ir "al revés" y usar una / su umask.

Nota al margen: digo "al revés" ya que el valor de umask es exactamente lo que parece: una máscara , que oculta / elimina permisos en lugar de "otorgarlos" como con la notación octal numérica de chmod.

Puede ejecutar el comando shell-builtin umaskpara ver cuál es su umask de 3 dígitos; para mí lo es 022. Esto significa que cuando ejecuto mkdir yodirectoryen una carpeta determinada (por ejemplo, mahome) stat, obtendré una salida parecida a esta:

               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)
 # 

Ahora, para agregar un poquito más sobre esos permisos octales. Cuando crea un directorio, "su sistema" toma sus permisos de directorio predeterminados [que se aplican a los nuevos directorios (su valor debería ser 777)] y coloca su máscara (u), ocultando efectivamente algunos de esos permisos. Mi umask es 022; ahora, si "restamos" 022 de 777 (técnicamente, restar es una implicación excesiva y no siempre es correcto; en realidad, estamos desactivando las permanentes o la máscara ) ... obtenemos 755 como se indica (o "establecido" ) antes.

Podemos omitir el '0' delante de los octales de 3 dígitos (para que no tengan que ser de 4 dígitos) ya que en nuestro caso no queríamos (o mejor dicho no mencionamos) ningún stickybits, setuids o setgids (es posible que desee verlos, por cierto, podrían ser útiles ya que va al 777). Entonces, en otras palabras, 0777 implica (o es equivalente a) 777 (pero 777 no es necesariamente equivalente a 0777, ya que 777 solo especifica los permisos, no los setuids, setgids, etc.)

Ahora, para aplicar esto a su pregunta en un sentido más amplio, (ya) tiene algunas opciones. Todas las respuestas anteriores funcionan (al menos de acuerdo con mis coreutils). Pero puede (o es muy probable que lo haga) tener problemas con las soluciones anteriores cuando desee crear subdirectorios (directorios anidados) con 777 permisos todos a la vez. Específicamente, si hago lo siguiente en mahome con una 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

Conseguiré permanentes 755para ambos yodirectoryy yostuff, solo con 777permanentes para mastuffinyostuff. Entonces, parece que umaskes todo lo que se abofetea yodirectoryy yostuff... para evitar esto, podemos usar una subcapa:

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

y eso es. 777 permanentes para yostuff, mastuffinyostuff y yodirectory.


7

puede usar el siguiente comando para crear un directorio y otorgar permisos al mismo tiempo

mkdir -m777 path/foldername 

1
no hay espacio entre -my 777
Omer Gafar

1

No lo hagas: mkdir -m 777 -p a/b/c ya que eso solo establecerá el permiso 777en el último directorio, c; ayb se crearán con el permiso predeterminado de su umask.

En lugar de crear nuevos directorios con permiso 777, ejecute mkdir -puna subcapa en la que anule la máscara de usuario:

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

Sin embargo, tenga en cuenta que esto no cambiará los permisos si ya existe alguno de a, byc.


Sí, si pasa una umask de 4 dígitos, el dígito inicial siempre debe ser cero (aunque puede omitirlo). Puede ser por simetría con chmod, donde el primer dígito octal establece los bits setuid, setgid y sticky, pero si es así, no tiene sentido ya que umask no le permite restringirlos.
John Mellor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.