¿Cambia recursivamente el permiso de archivo pero no los directorios?

13

Estaba haciendo un cambio recursivo masivo de permisos de algunos archivos que había migrado a un sistema Unix. Los cambié a ug + rw, pero luego descubrí que no podía atravesar subdirectorios. Miré la página del manual chmody no vi ninguna explicación para excluir directorios, así que busqué en Google un poco y descubrí que la gente solía findcambiar de forma recursiva los permisos en los directorios para 'ejecutar' para el usuario y el grupo. Lo hice y luego pude verlos.

Pero me pareció que debería poder hacer este hallazgo chmod: cambiar recursivamente los archivos para leer / escribir, pero no hacer que los directorios sean imposibles de recorrer. ¿He hecho esto de la manera "correcta" o hay una manera más simple de hacerlo?

usuario394
fuente

Respuestas:

12

La mejor solución debería ser

chmod -R ug=rwX,o=rX /path

donde la capital Xsignifica: establecer ejecutar bit si

el archivo es un directorio o ya tiene permiso de ejecución para algún usuario

(Citado de la chmodpágina del manual).

O también, si quieres usar find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)
enzotib
fuente
Utilicé la versión abierta para todos de este comando para mi disco duro USB: chmod -v -R ugo = rwX / path ¡Gracias!
The Dude
Evidentemente, no hay manera sin usar findpara establecer todos los permisos de archivo a 600 y todos los permisos de directorio a 700. (Llegué aquí a través de mis google sobre el tema). Si eso se puede hacer con un solo chmod -Rcomando, no dude en corregirme.
Comodín el
@Wildcard: no exactamente, el comando chmod -R u=rwX,go= /pathhace casi lo que desea: establece todos los directorios en 700 y todos los archivos en 600 o 700, dependiendo de si el bit de ejecución ya está configurado o no, y creo que esto es lo correcto .
enzotib
1
@enzotib, sí, casi, pero no del todo. En mi caso, quiero deshabilitar el bit de ejecución para todos los archivos (pero no los directorios, por supuesto) independientemente de si son scripts o binarios o lo que sea. Entonces el findcomando que escribiste fue muy útil como plantilla. :)
Comodín el
@Wildcard, ¿qué hay de eliminar primero el bit de ejecución, recursivamente, luego agregarlo nuevamente a los directorios con el comando anterior?
Michael
3

Usar find es la forma "correcta" y la única forma programática, aunque hay variaciones:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

o

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

o el más lento:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Cada uno de estos selecciona un archivo (no directorio, no enlace simbólico) y aplica el chmodcomando en él. Los dos primeros reducen el número de llamadas chmodagregando el archivo al final de una línea de comando interna cada vez hasta que se alcanza un máximo (a menudo 10), luego llama al comando y comienza a reconstruir un nuevo comando. La última declaración genera un nuevo proceso para cada archivo, por lo que es menos eficiente.

Arcege
fuente