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.


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 {} \; \)

¿""} 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).


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.