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:

Ignacio 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!