Linux: Set permission only to directories
chmod
can actually do this itself; the X
symbolic permission means "execute, if it makes sense" which generally means on directories but not files. So, you can use:
chmod -R u=rwX,go=rX /path/to/htdocs
The only potential problem is that if any of the plain files already have execute set, chmod
assumes it's intentional and keeps it. If this is a potential problem and you have the GNU version of chmod
(i.e. you're on Linux), you can get it to remove any stray execute permissions like this:
chmod -R a-x,u=rwX,go=rX /path/to/htdocs
Unfortunately, this trick doesn't work with the bsd (/macOS) version of chmod
(I'm not sure about other versions). This is because the bsd version applies the X
permission based on "the original (unmodified) mode", i.e. whether it had any execute bits before the a-x
modification was done (see the man
page).
Use find
to search for directories and apply chmod on them:
find -type d | xargs chmod 775
Use type f
for file:
find -type f | xargs chmod 775
Use find's -type
option to limit actions to files and directories. Use the -o
option to specify alternate actions for different types, so you only have to run find
once, rather than separately for each type.
find htdocs -type f -exec chmod 664 {} + -o -type d -exec chmod 775 {} +