chmod può effettivamente farlo da solo; il X autorizzazione simbolica significa "esegui, se ha senso" che generalmente significa sulle directory ma non sui file. Quindi, puoi usare:
chmod -R u=rwX,go=rX /path/to/htdocs
L'unico potenziale problema è che se qualcuno dei file semplici ha già set di esecuzione, chmod presuppone che sia intenzionale e lo mantiene. Se questo è un potenziale problema e hai la versione GNU di chmod (cioè sei su Linux), puoi far sì che rimuova qualsiasi autorizzazione di esecuzione vagante come questa:
chmod -R a-x,u=rwX,go=rX /path/to/htdocs
Sfortunatamente, questo trucco non funziona con la versione bsd (/macOS) di chmod (Non sono sicuro di altre versioni). Questo perché la versione bsd applica il X autorizzazione basata sulla "modalità originale (non modificata)", ovvero se aveva bit di esecuzione prima il a-x la modifica è stata eseguita (vedi il man pagina).
Usa find per cercare directory e applicare chmod su di esse:
find -type d | xargs chmod 775
Usa il tipo f per file:
find -type f | xargs chmod 775
Usa -type di find opzione per limitare le azioni a file e directory. Usa il -o opzione per specificare azioni alternative per tipi diversi, quindi devi solo eseguire find una volta, piuttosto che separatamente per ogni tipo.
find htdocs -type f -exec chmod 664 {} + -o -type d -exec chmod 775 {} +