Cómo cambiar los permisos de archivo para un directorio en un comando

11

¿Cómo puedo cambiar todos los permisos de archivo de un directorio en un comando en Unix?

Der Hochstapler
fuente
¿Quiere decir que desea cambiar los permisos para todos los archivos en el directorio? ¿Desea que esto también vaya a directorios anidados? ¿Desea cambiar los permisos del directorio (s) en sí, o solo los archivos dentro? Por último, ¿intentaste buscar en este sitio antes de publicar tu pregunta?
Ether

Respuestas:

21

Para cambiar los permisos en un archivo o entrada de directorio de forma no recursiva, use el chmodcomando (vea man chmod para leer más sobre sus opciones específicas):

chmod +x dir  # Set a directory to be listable
chmod +x file # Set a file to be executable

Para cambiar el propietario de un archivo / directorio de forma recursiva (que afecta a todos los descendientes):

chown -R username           dir # Recursively set user
chown -R username:groupname dir # Recursively set user and group

Para cambiar los bits de permisos de todos los archivos en un directorio, recursivamente:

find dir -type f -exec chmod 644 {} ';' # make all files       rw-r-r-

Para cambiar los bits de permisos de todos los directorios:

find dir -type d -exec chmod 755 {} ';' # make all directories rwxr-xr-x

Sería bueno si pudieras hacer esto:

chmod -R 755 dir

Sin embargo, esto tiene problemas. Trata los archivos y directorios de la misma manera. El comando anterior hace que los directorios sean listables y legibles para todos los usuarios, pero también hace que todos los archivos sean ejecutables, que generalmente es lo que no desea hacer.

Si lo cambiamos a 644, tenemos otro problema:

$ 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
...

El problema es que 644elimina el bit de la lista de directorios, y este efecto secundario impide un mayor recorrido del árbol de archivos. Podría solucionar este problema utilizando sudo, pero aún así terminará con directorios que son completamente inútiles para los usuarios no root.

El punto es que chmod -Rfunciona bien en algunos casos (por ejemplo chmod -R g-r), pero no en los casos en que desea jugar con el -xbit, ya que funciona en archivos y directorios de manera indiscriminada.

Joey Adams
fuente
¿Por qué estás asumiendo que él quiere configurar 644o que está configurando -xen los directorios? La pregunta solo estipula que quiere cambiar los permisos, no a qué en particular.
Reese Moore el
@ Reese Moore: Tienes razón. El autor de la pregunta ni siquiera dijo nada sobre cambiar los permisos de forma recursiva.
Joey Adams
1
Por lo general, desea utilizar las cosas de modo simbólico + y - para eso; es decir,chmod -R go=u,go-w /dir
dannysauer
6

chmodtiene una -Rbandera que significa cambiar los permisos en archivos y directorios de forma recursiva.

Puede usar 'X' mayúscula para hacer lo correcto para las carpetas: 'X' = "ejecutar / buscar solo si el archivo es un directorio o ya tiene permiso de ejecución para algún usuario"

Entonces, por ejemplo: chmod -R ug = rwX, o-rwx.

Haría que un árbol completo fuera accesible para el propietario y el grupo de cada archivo, y que nadie más pueda acceder a él. Cualquier archivo ya ejecutable seguiría siendo ejecutable después, y todos los directorios tendrían la 'x' para el usuario y el grupo y no para otros.

Reese Moore
fuente
Pruebe chmod -R 444 somediren un directorio con archivos en él. Obtiene Permission deniedporque el indicador -x se está quitando de los directorios y es necesario para continuar leyendo el directorio.
Joey Adams
1
Una adición útil a esto es la sintaxis X = Y. Puede, por ejemplo, establecer permisos de grupo para el permiso del usuario utilizando chmod -R g = u dir para configurar el grupo y el equivalente del usuario. Esto funciona alrededor de cosas como directorios que necesitan ejecutables mientras que los archivos "simples" no.
Paul Rubel
3
chmod -R <file permission> *

De la página del manual de chmod:

-R, --recursive
              change files and directories recursively

Úselo chmodcon el -Rinterruptor para varias direcciones que tiene un árbol de subdirectorios que tiene millones de archivos dentro y desea cambiar los permisos de estos archivos juntos de una sola vez.

El permiso de archivo puede ser por ej. 777, 755, 644, etc.

kushal sp
fuente