chmod en realidad puede hacer esto por sí mismo; el X permiso simbólico significa "ejecutar, si tiene sentido", lo que generalmente significa en directorios pero no en archivos. Entonces, puedes usar:
chmod -R u=rwX,go=rX /path/to/htdocs
El único problema potencial es que si alguno de los archivos sin formato ya tiene un conjunto de ejecución, chmod asume que es intencional y lo mantiene. Si se trata de un problema potencial y tienes la versión GNU de chmod (es decir, está en Linux), puede hacer que elimine cualquier permiso de ejecución perdido como este:
chmod -R a-x,u=rwX,go=rX /path/to/htdocs
Lamentablemente, este truco no funciona con la versión bsd (/macOS) de chmod (No estoy seguro acerca de otras versiones). Esto se debe a que la versión bsd aplica el X permiso basado en "el modo original (sin modificar)", es decir, si tenía bits de ejecución antes el a-x se realizó la modificación (ver el man página).
Usa find para buscar directorios y aplicar chmod en ellos:
find -type d | xargs chmod 775
Utilice el tipo f para archivo:
find -type f | xargs chmod 775
Usa el -type de find Opción para limitar acciones a archivos y directorios. Usa el -o opción para especificar acciones alternativas para diferentes tipos, por lo que solo tiene que ejecutar find una vez, en lugar de por separado para cada tipo.
find htdocs -type f -exec chmod 664 {} + -o -type d -exec chmod 775 {} +