Chmod recursivo: rw para archivos, rwx para directorios

28

Quiero chmodmuchos archivos y directorios. Como xindica la lista de directorios y ejecutar para archivos normales, me gustaría solicitar rwarchivos y rwxdirectorios. ¿Es posible usar solo el chmodcomando?

Si no es así, ¿cuál es la forma más conveniente?

Hacer una chmod -R 770no es una posibilidad ya que no quiero que los archivos normales se vuelvan ejecutables.

Eliminado
fuente
1
¿Realmente quieres permiso de escritura pública en archivos y directorios? ¿Eso significa que no te importa quién manipula ninguno de los archivos?
Jonathan Leffler
Cierto. Lo cambié arriba.
Borrado el

Respuestas:

19

Hago esto en ocasiones usando un solo findcomando. Feo pero efectivo.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)
Baumgart
fuente
¿""} No necesita ser citado, solo en caso de que las rutas contengan espacios? Me gusta find . -type d -exec chmod -vc 755 "{}" \;(incluso -vcpara algunos comentarios). (¿Y quizás, solo para aclarar, agregar los dos comandos independientes a la respuesta también?)
Arjan
No, {} no necesita ser citado (solo probé para estar absolutamente seguro). Cuando find inserts {} en el comando, se escapa correctamente. No he buscado el funcionamiento interno de find, pero supongo que crea una matriz de argumentos para pasar a exec (), y strcpy () el nombre de archivo en la matriz. Cuando chmod mira sus argumentos, aparecería correctamente.
baumgart
37

Use el permiso X, de la página del manual:

Los bits de ejecución / búsqueda si el archivo es un directorio o alguno de los bits de ejecución / búsqueda se configuran en el modo original (sin modificar). Las operaciones con el símbolo permanente "X" solo tienen sentido junto con el símbolo operativo "+", y se ignoran en todos los demás casos.

Entonces haga lo siguiente:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Esto elimina el bit de ejecución de todos los archivos y directorios seguido de agregar privilegios de lectura y escritura a todo, y privilegios de ejecución solo a directorios. (Ningún archivo normal tiene el bit de ejecución activado desde el primer paso).

Ben S
fuente
1
Esto no forzará el modo 666 en los archivos normales. no borra el bit ejecutable para archivos normales si ya lo tienen configurado.
quack quijote
Entonces, en ese caso, ¿qué podrías hacer chmod -R a-x [directory]seguido chmod -R a+rwX [directory]?
jwaddell
@jwaddel: Eso debería funcionar. Usted está quitando toda bits de ejecución, independientemente de archivo / tipo de directorio, a continuación, añadir a ejecutar sólo los directorios y archivos normales que ya tienen el bit de ejecución en (que ahora es ninguno.)
Ben S
Una vez que lo hago a-x, el directorio no es accesible. De hecho, chmod falla con el permiso denegado y no eliminará el bit ejecutable de los archivos dentro del directorio. ¿Hay alguna manera de hacer esto sin ser root?
avakar
14

También puede usar findjunto con xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

donde -typeespecifica d irectorio o f ile.

John T
fuente
1
¿No tiene xargs una limitación de longitud? Es un montón de archivos y directorios.
Borrado el
2
Primero haría directorios, luego archivos. De lo contrario, correría el riesgo de perder algún subárbol debido a la falta de permiso. Además, debe verificar si la lista se explora antes o después del chmod, de lo contrario, igual que antes. Y sí, me abstendría de usar xargs.
Stefano Borini
1
xargses lo suficientemente inteligente como para romper largas líneas de comando en ejecuciones múltiples. Consulte su página de manual de xargs y asegúrese de verificar xargs --show-limits.
Mike