¿Cómo cambio los permisos para una carpeta y todas sus subcarpetas y archivos en un solo paso en Linux? [cerrado]

1806

Me gustaría cambiar los permisos de una carpeta y todas sus subcarpetas y archivos en un solo paso (comando) en Linux.

Ya he probado el siguiente comando, pero solo funciona para la carpeta mencionada:

chmod 775 /opt/lampp/htdocs

¿Hay una manera de establecer chmod 755para /opt/lampp/htdocsy todo su contenido, incluidas las subcarpetas y archivos?

Además, en el futuro, si creo una nueva carpeta o archivo dentro htdocs, ¿cómo se pueden configurar los permisos automáticamente 755?

También eché un vistazo a este enlace:

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

Adán
fuente
44
¿Tenía la intención de escribir chmod 75 /opt/lampp/htdocso debería ser realmente chmod 755 /opt/lampp/htdocs?
HelloGoodbye
234
El hecho de que la cuarta pregunta más votada sobre Linux está "cerrada como fuera de tema" es hilarante. ¿Quién sino un programador se preocuparía por chmod? ¿Cómo es esto fuera de tema? ¿Por qué las etiquetas "permisos", "carpeta" y "cmod" incluso están fuera de tema?
Arthur Dent
8
@ArthurDent, porque esta pregunta (aunque perfectamente válida y útil) es más adecuada para un sitio de SE centrado en el sistema, como SuperUser o ServerFault. No está expresamente relacionado con la programación.
Timelmer
26
@timelmer Claro, pero vuelvo a preguntar, ¿por qué las etiquetas "permisos", "carpeta" y "cmod"? ¿Cuándo se usaría cmod 'expresamente' para la programación?
Arthur Dent
99
Si quieres ser realmente exigente, Bash es en realidad un lenguaje de script, pero también lo es php, que SO parece no importarle.
Timelmer

Respuestas:

2958

Las otras respuestas son correctas, ya que chmod -R 755establecerán estos permisos para todos los archivos y subcarpetas en el árbol. ¿Pero por qué querrías hacerlo ? Puede tener sentido para los directorios, pero ¿por qué establecer el bit de ejecución en todos los archivos?

Sospecho que lo que realmente quieres hacer es configurar los directorios en 755 y dejar los archivos solos o configurarlos en 644. Para esto, puedes usar el findcomando. Por ejemplo:

Para cambiar todos los directorios a 755 ( drwxr-xr-x):

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

Para cambiar todos los archivos a 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
WombleGoneBad
fuente
231
¿Alguien quiere explicar qué {} \;significa al final de la línea?
Nilzor
307
@Nilzor chmod 644 {} \;especifica el comando que se ejecutará findpara cada archivo. {}se reemplaza por la ruta del archivo, y el punto y coma denota el final del comando (escapado, de lo contrario sería interpretado por el shell en lugar de find).
tobbez
25
"pero por qué establecer el bit de ejecución en todos los archivos" ¿Por qué no? Soy nuevo en Ubuntu / Linux ...
FlavorScape
12
@FlavorScape Womble está configurando el bit de ejecución exclusivamente en los directorios devueltos por find. El permiso de ejecución en un directorio permite a una clase de usuario enumerar el contenido de ese directorio y crear un CD en él. En términos generales, desea que tanto r como x en un directorio sean accesibles para usted, a pesar de que puede haber casos extraños en los que establecería solo uno u otro. Consulte esta guía para obtener más información: nixsrv.com/llthw/ex23
Alexandr Kurilin
25
Con la excepción de sleepynate, cada respuesta descuidaba abordar el aspecto de su pregunta con respecto a la configuración de permisos para archivos / carpetas creados en el futuro .
JGarrido
781

Marque la opción -R

chmod -R <permissionsettings> <dirname>

En el futuro, puede ahorrar mucho tiempo revisando primero la página del manual:

man <command name>

Entonces en este caso:

man chmod
Steve Robillard
fuente
147
¿qué es eso man?
Adam
36
significa página manual y es un comando de Linux que muestra la página de manual de un comando (la mayoría de los comandos de Linux tienen una página de manual). prueba man ls o man man.
Steve Robillard
8
Esto no funcionó para mí en la Terminal en Mac OS X. Allí hice "chmod -R <permissionsettings> <dirname> *" y funcionó.
Einar Ólafsson
127
Creo que a estas alturas, en realidad es más rápido publicar aquí o usar Google que usar man. Particularmente para algo como grepdónde, si eres nuevo man, puede llevar mucho tiempo localizar ejemplos en el documento, pero Google o SO proporcionan ejemplos en segundos.
ely
17
Para el registro, aquellos que no están familiarizados con Linux pueden no estar familiarizados con el hombre. Solo sé de su existencia, pero tratar de descubrir cómo usarlo requeriría una aventura de Google en sí misma. Posiblemente sea una empresa que valga la pena, pero debes darte cuenta de que encontré ESTE mensaje muy a través de Google y respondió la pregunta EXACTA que estaba haciendo. Recursos, mi amigo. Los recursos son invaluables. Y puede pensar que esto no tenía sentido y que debería haber revisado al hombre, pero esto me ha ayudado a mí y a CIENTOS de otros (miles incluso). Así que por favor considere eso.
Soundfx4
391

Si desea establecer permisos en todos los archivos a+ry en todos los directorios a+xy hacerlo recursivamente a través del árbol de subdirectorios completo, use:

chmod -R a+rX *

El X(¡eso es capital X, no pequeño x!) Se ignora para los archivos (a menos que ya sean ejecutables para alguien) pero se usa para los directorios.

Pete
fuente
27
Gran respuesta. Solo tenga en cuenta que * no coincidirá con los archivos ocultos (nombres que comienzan con un punto). Puede tener más sentido, entonces, usar. (para el directorio actual).
Aaron Adams
21
Esta es la respuesta correcta. Para mi caso, quería establecer todos los directorios en 775 y todos los archivos en 664 . La excelente respuesta de @Pete me llevó a los chmoddocumentos, donde descubrí que podía usarlos chmod -R g+wX .. ¡Bravo!
chadoh
8
Esto no se eliminará xen los archivos si ya lo tienen.
Benoit Duffez
55
En caso de que no esté completamente claro, X mayúscula significa "hacer que todos los directorios sean ejecutables" (pero no los archivos).
Matt Browne
44
@BenoitDuffez si su objetivo es eliminar también el bit ejecutable de los archivos, puede combinar directivas, como "a-x + rX" para eliminar "x" de todo y luego configurar "r" para todo y "x" para directorios solamente .
nunks
144

Puede usar -Rcon chmodpara el recorrido recursivo de todos los archivos y subcarpetas.

Es posible que necesite sudo, ya que depende de que LAMP esté siendo instalado por el usuario actual u otro:

sudo chmod -R 755 /opt/lampp/htdocs
ravi ranjan
fuente
17
De alguna manera, sudo chmod 755 -R /directoryno funcionó, pero lo sudo chmod -R 755 /directoryhizo. Extraño. Estoy usando Mac os x por cierto.
lomse
8
Esto es correcto en mi experiencia. La bandera debe aparecer directamente después de chmod, no en ninguna parte de la cadena.
orionrush
1
El comando escrito arriba está mal. El comando recursivo correcto es: sudo chmod -R 755 / opt / lampp / htdocs Nota: -R debe ser anterior a 755
Sandip Patel - SM
Esta solución está funcionando bien para Redhat. ¡Gracias!
Lavande
Funcionó bien en RHEL y sudo chmod 755 -Rfuncionó
AnBisw
79

El comando recursivo correcto es:

sudo chmod -R 755 /opt/lampp/htdocs

-R: cambia cada subcarpeta, incluida la carpeta actual

Pramendra Gupta
fuente
1
hola, ¿estás seguro de que eres la carpeta actual a pesar de la ruta?
shareef
OSX USANDO: sudo chmod 777 logs / -R OBTENIENDO: chmod: -R: No
existe
76

Para establecer en todas las subcarpetas (recursivamente) use -R

chmod 755 /folder -R

Y use umask para establecer el valor predeterminado en nuevas carpetas / archivos cd / folder umask 755

Topera
fuente
24
¡NO establezca su umasken 755! ¡No podrá enumerar, leer ni utilizar ningún archivo o directorio que cree!
sleepynate
14
¿Quiso decir umask 022?
Xkeeper
44
esto establece todo en 755, incluidos los archivos.
Patrick Mutwiri
@sleepynate ¿De qué demonios estás hablando? 755 significa que el propietario puede leer, escribir y ejecutar, y todos los demás usuarios pueden leer y ejecutar, pero no escribir en el objeto
svin83
2
@NicHartley @ svin83 umask son los bits que se enmascararán de los permisos, por lo que es efectivamente el inverso 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/htdocsestablecerá recursivamente los permisos. No hay forma de establecer los permisos para los archivos automáticamente solo en este directorio que se crea después de establecer los permisos, pero puede cambiar sus permisos de archivos predeterminados en todo el sistema con la configuración umask 022.

sueño
fuente
99
La respuesta de sleepynate es la ÚNICA correcta. El póster formuló dos preguntas: 1) ¿Cómo reparo los permisos en archivos y carpetas, y 2) cómo cambio los valores predeterminados (que significan archivos "futuros")? Como dijo Nate, el primero está con "chmod", y el segundo está con "umask". También agregaría que NO HAY MANERA de cambiar umask en solo 1 directorio ... umask es "todo o nada" por usuario. Sin embargo, nada le impide crear un nuevo usuario, que comparte grupos con usted, de modo que puede 'sudo -u someuser [crear archivo] ". Eso es pensar un poco fuera de la caja, pero es una buena solución.
Scott Prive
Creo que tiene razón, pero no puede inheritser una solución para muchos casos o ¿funcionará exclusivamente con NTFS-3G?
Sebastian Schlicht
sin dar permiso a las carpetas pueden crearse en el futuro, es posible que no se pueda copiar una carpeta, por ejemplo, myforlderdesde otros lugares (como una PC) a este directorio de destino (en un servidor) porque intentará crear una nueva carpeta en el directorio de destino con nombre para el myfolder que no tiene permiso para hacerlo. Como tengo root, solo uso chown -R username:usergroup /directory.
Jason Goal
27

Es posible que desee considerar esta respuesta dada por nik en el superusuario y usar "one chmod" para todos los archivos / carpetas como este:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Iam Zesh
fuente
99
Advertencia, es fácil encontrarse con los límites de la línea de comandos.
Lothar
1
Tengo este error: -bash: / bin / chmod: Lista de argumentos demasiado larga
Oleg Abrazhaev
Sería mejor utilizar la -execopción de findpara superar el Argument list too longerror.
miravalls
Relacionado: Cambie todos los permisos de carpeta con un comando en U&L
G-Man dice 'Reinstate Monica' el
20

Utilizar:

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

Sin embargo, ten cuidado con eso. Realmente puede lastimarte si cambias los permisos de los archivos / carpetas incorrectos.

Nate Starner
fuente
20

Aquí hay otra forma de configurar directorios en 775 y archivos en 664.

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

Puede parecer largo, pero es genial por tres razones:

  1. Escanea el sistema de archivos solo una vez en lugar de dos veces.
  2. Proporciona un mejor control sobre cómo se manejan los archivos frente a cómo se manejan los directorios . Esto es útil cuando se trabaja con modos especiales como el bit adhesivo , que probablemente desee aplicar a directorios pero no a archivos.
  3. Utiliza una técnica directamente de las manpáginas (ver más abajo).

Tenga en cuenta que no he confirmado la diferencia de rendimiento (si existe) entre esta solución y la de simplemente usar dos comandos de búsqueda (como en la solución de Peter Mortensen). Sin embargo, ver un ejemplo similar en el manual es alentador.

Ejemplo de la man findpágina:

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.

Salud

Chrisfargen
fuente
Ahora, ¿cómo convertir eso en un script de shell para que podamos ejecutar openmod $ folder?
StR
Gente, por favor use xargs. Ahorra miles de invocaciones de procesos.
seanahern
13

chmod -R 755 directory_namefunciona, pero ¿cómo mantendría los archivos nuevos en 755 también? Los permisos del archivo se convierten en el permiso predeterminado.

Sanchit Gupta
fuente
Lo hice pero no puedo abrir la terminal desde allí. No puedo arreglarlo
Kavindu Gayantha
9

Para Mac OS X 10.7 (Lion), es:

chmod -R 755 /directory

Y sí, como todos los demás dicen, tenga cuidado al hacer esto.

wmartin
fuente
9

Desea asegurarse de que los archivos y directorios apropiados sean chmod-ed / permisos para aquellos que sean apropiados. Para todos los directorios que quieras

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

Y para todas las imágenes, JavaScript, CSS, HTML ... bueno, no debes ejecutarlas. Entonces usa

chmod 644 img/* js/* html/*

Pero para todo el código lógico (por ejemplo, el código PHP), debe establecer permisos para que el usuario no pueda ver ese código:

chmod 600 file
NikolaiDante
fuente
6

Creo que Adam estaba preguntando cómo cambiar el valor de umask para todos los procesos que intentan operar en el /opt/lampp/htdocsdirectorio.

La máscara del modo de creación de archivos de usuario (umask) se usa para determinar el permiso de archivo para los archivos recién creados. Se puede utilizar para controlar el permiso de archivo predeterminado para archivos nuevos.

así que si va a utilizar algún tipo de programa ftp para cargar archivos /opt/lampp/htdocs, debe configurar su servidor ftp para usar la máscara que desee.

Si php crea archivos / directorios, por ejemplo, debe modificar el código php

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

si va a crear nuevos archivos / carpetas desde su sesión bash, puede configurar el valor de umask en su perfil de shell ~ / .bashrc O puede configurar umask en /etc/bashrco /etc/profilearchivo para todos los usuarios. agregue lo siguiente al archivo: 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

Y para cambiar los permisos de los archivos ya creados, puede usar find. Espero que esto ayude.

Viktor
fuente
4

Hay dos respuestas para encontrar archivos y aplicarlos chmod. El primero es findel archivo y aplicarlo chmodtal como lo encuentra (como lo sugiere @WombleGoneBad).

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

La segunda solución es generar una lista de todos los archivos con el findcomando y proporcionar esta lista al chmodcomando (como lo sugiere @lamgesh).

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

Ambas versiones funcionan bien siempre que el número de archivos devueltos por el findcomando sea pequeño. La segunda solución se ve muy bien a la vista y es más legible que la primera. Si hay una gran cantidad de archivos, la segunda solución devuelve un error:Argument list too long.

Entonces mi sugerencia es

  1. Úselo chmod -R 755 /opt/lampp/htdocssi desea cambiar los permisos de todos los archivos y directorios a la vez.
  2. Úselo find /opt/lampp/htdocs -type d -exec chmod 755 {} \;si la cantidad de archivos que está utilizando es muy grande. La -type xopción busca solo un tipo específico de archivo, donde d se usa para buscar el directorio, f para el archivo yl para el enlace.
  3. Usar de chmod 755 $(find /path/to/base/dir -type d)otra manera
  4. Es mejor usar el primero en cualquier situación.
Prabhu
fuente
2

Es muy simple.

En Terminal ve al administrador de archivos. ejemplo: sudo nemo. Vaya y /opt/luego haga clic en Propiedades → Permiso . y luego otro . Finalmente, cambie para crear y eliminar y acceder a archivos para leer y escribir y haga clic en el botón aplicar ... Y trabajar.

Debian
fuente
¿Qué es sudo nemo?
Vikranth Inti