Cómo cambiar los permisos de los archivos de un directorio con un solo comando
¿Cómo puedo cambiar todos los permisos de los archivos de un directorio con un solo comando en Unix?
¿Cómo puedo cambiar todos los permisos de los archivos de un directorio con un solo comando en Unix?
Para cambiar los permisos de una entrada de archivo o directorio de forma no recursiva, utilice el comando chmod
(consulte 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 (afectando 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 de un directorio, de forma recursiva:
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
Estaría bien poder hacer esto:
chmod -R 755 dir
Sin embargo, esto tiene problemas. Trata los archivos y los directorios de la misma manera. El comando anterior hace que los directorios puedan ser listados y leídos por todos los usuarios, pero también hace que todos los archivos sean ejecutables, que es lo que normalmente no se quiere 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 644
quita el bit de la lista de directorios, y este efecto secundario impide seguir recorriendo el árbol de archivos. Se puede evitar este problema usando sudo
, pero aún así se termina con directorios que son completamente inútiles para los usuarios que no son root.
La cuestión es que chmod -R
funciona muy bien en algunos casos (por ejemplo, chmod -R g-r
), pero no en los casos en los que se quiere jugar con el bit -x
, ya que opera sobre archivos y directorios indistintamente.
chmod
tiene una bandera -R
que significa cambiar los permisos de los archivos y directorios recursivamente.
Puede utilizar la ‘X’ mayúscula para hacer lo correcto para las carpetas: ‘X’ = “ejecutar/buscar sólo si el archivo es un directorio o ya tiene permiso de ejecución para algún usuario”
Así, por ejemplo: chmod -R ug=rwX,o-rwx .
Haría que todo un árbol fuera accesible para el propietario y el grupo de cada archivo, y no accesible para nadie más. 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 los demás.
chmod -R <file permission> *
De la página man de chmod
:
-R, --recursive
change files and directories recursively
Utilice chmod
con el interruptor -R
para múltiples direcciones que tengan un árbol de subdirectorios con millones de archivos en su interior y quiera cambiar los permisos de estos archivos de una sola vez.
Los permisos de los archivos pueden ser, por ejemplo, 777, 755, 644, etc.