Monday, March 05, 2007

Cómo cambiar permisos recursivamente solamente a archivos o directorios


En el mundo *nix, a menudo nos encontramos con la necesidad de cambiar permisos, tanto de archivos como de directorios (archivos al fin y al cabo). Para cambiar los permisos de todo un directorio, incluyendo archivos con una orden chmod –R bastar√≠a.
Pero que sucede, si los directorios deben tener un tipo de permiso diferente al de los archivos?
Ej.
Necesitamos que todos los directorios, incluido /ejemplo y sus subdirectorios, tengan permisos de lectura, escritura y ejecución, por parte de su propietario, y permisos de sólo lectura por parte del grupo y del resto o sea 744. Además, necesitamos que todos los arhivos de /ejemplo y de sus subdirectorios tengan permisos lectura y escritura de su propietario (no así de ejecución), y de sólo lectura por parte del grupo y del resto o sea 644.
En este caso si ejecut√°semos chmod –R 744, la orden tambi√©n afectar√≠a a los archivos; por otra parte si ejecut√°semos chmod –R 644 suceder√≠a lo mismo.
Entonces que hacemos?
Recurrimos al comando find que nos permite entre tantas cosas, listar tanto archivos como directorios y poder enviarlos mediante una tubería, hacia la entrada del comando xargs quien nos va a permitir ejecutar chmod.

find ./ -type d -print | xargs chmod 744;
find ./ -type f -print | xargs chmod 644;

Que hace cada uno?
./ indica que busque desde el directorio actual en adelante (en nuestro caso /ejemplo)
-type especifica que la b√ļsqueda debe contener directorios –d y archivos –f
-print imprime el nombre completo del archivo en la salida est√°ndar
| tubería que toma la salida estándar y la redirige hacia la entrada de xargs quien construye una entrada válida para chmod quien en definitiva realiza los cambios.

Bueno, como siempre espero que les sea de utilidad.
Saludos.

3 comments:

dosnon said...

Ejecutarlo así dará problemas si el nombre de archivo contiene espacios. Mejor usar:

find -type f -exec chmod 644 "{}" \;
find -type d -exec chmod 755 "{}" \;

via netcom

Matías Silvero said...

Gracias Dosnon, no lo había tenido en cuenta :d

Anonymous said...

Groso total!