40

I have to change the permissions of the htdocs directory in apache to a certain group and with certain read/write/execute.

The directories need to have 775 permissions and the files need to have 664.

If I do a recursive 664 to the htdocs, then all files and directories will change to 664.

I don't want to change the directories manually.

Is there any way to change only files or directories?

7 Answers 7

76

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).

Sign up to request clarification or add additional context in comments.

3 Comments

Best Answer by far, if you have enough recursive directories, xargs will fail eventually. check the man pages for more info
To combat the potential problem of existing execute flags remaining, you can use: chmod -R a-rwx,u+rwX,go+rX This effectively removes all permissions for user, group and other and then only adds those that you want.
@AxelWilczek Unfortunately, that trick only works with some versions of chmod. But I'll add it my answer with an explanation.
45

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 {} +

3 Comments

Better to use chmods built in support. See Gordon Davisson's answer below
This method is better because if you have a mess of 'x' on basic files that don't need it, this find method above cleans them all up, while the u=rwX,go=rX does not clean anything up.
This worked like a charm and saved hours of work. Thank you!!
7

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

Comments

4

I use something similar to the solution provided by Gordon:

chmod -R ug=rw,o=r,a+X /path/to/folder/

It should always set 775 for folders and 664 for files, even if the execute permission was previosly set for some file

Comments

4

Gordon's answer above is correct, but if you're trying to lock down access to a directory tree, it leaves scripts that are executable to the owner also executable to whoever has been granted the capital X.

Using

find <path> -type d -exec chmod 775 {} +

or

find <path> -type d -exec chmod 755 {} +

is safer.

Comments

2

try:

find htdocs -type d -exec chmod 775 {} +

1 Comment

This sets the directory permissions, but not the file permissions.
-1

for dirs or files

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.