Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I've been trying to clean up permissions on a few boxes and have been scouring the chmod man as well as all the internet documentation that I an handle without any luck -- so here we go.

Basically, I've got a directory with many sub directories and files -- and I'd like to set the following permissions:

For directories: 770 (u+rwx, g+rwx, o-rwx)

For files: 660 (U+rw, g+rw, a-x, o-rw)

I'd like to try and do this with a single recursive chmod if possible -- as to avoid recursing through each directory and setting file-by-file permissions.

I imagine there's got to be a way to do this without writing a shell script of my own -- but I haven't been able to find anything.

I appreciate your help!

share|improve this question
add comment

4 Answers

up vote 6 down vote accepted

I do find a script useful since it's often useful to change both file and directory permissions in one swoop, and they are often linked. 770 and 660 for shared directories on a file server, 755/644 for web server directories, etc. I keep a script w/ the most commonly used mode for that type of server in root's bin/ and just do the find manually when the common mode doesn't apply.

#!/bin/sh
# syntax: setperm.s destdir
#
if [ -z $1 ] ; then echo "Requires single argument: <directoryname>" ; exit 1 ;                                       fi

destdir=$1

dirmode=0770
filemode=0660

YN=no

printf "\nThis will RECURSIVELY change the permissions for this entire branch:\n                                      "
printf "\t$destdir\n"
printf "\tDirectories chmod = $dirmode\tFiles chmod = $filemode\n"
printf "Are you sure want to do this [$YN]? "

read YN

case $YN in
        [yY]|[yY][eE][sS])
        # change permissions on files and directories.
        find $destdir -type f -print0 | xargs -0 chmod $filemode $i
        find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;

        *) echo "\nBetter safe than sorry I always say.\n" ;;
esac
share|improve this answer
    
Wow! This is exactly what I was looking for. Thank you very much! –  Skone Jan 21 '10 at 0:33
    
Hey iPaulo -- can you by chance explain the "$ii" on the line "find $destdir -type d -print0 | xargs -0 chmod $dirmode $ii ;;". I'm not sure I understand why its not just "find $destdir -type d -print0 | xargs -0 chmod $dirmode $i ;;" Thanks! –  Skone Jan 21 '10 at 19:35
add comment

No need for scripts.

// Directories:

find . -type d -exec chmod XXX {} \;

// Files:

find . -type f -exec chmod XXX {} \;
share|improve this answer
    
Thank you very much! –  Skone Jan 20 '10 at 22:54
add comment

In your case it might not have to be as complicated as others has made it out to be (though find is indeed a good tool for this sort of thing in general). The difference between the modes are the execute bit. If it is the case that no files already has the execute bit set, then you can do it in a single invocation of chmod, just as you asked.

chmod -R u=rwX,g=rwX,o= FILE...

The key here is the capital X, which the man page explains as

execute/search only if the file is a directory or already has execute permission for some user.

Thus, if your files do not already have the execute bit set, it will only be set for directories.

share|improve this answer
    
Interesting point. Thanks for the feedback! –  Skone Jan 21 '10 at 19:12
add comment

Clean and simple:

chmod 660 $(find . -type f)
chmod 770 $(find . -type d)
share|improve this answer
    
Very elegant approach. –  user5336 Sep 13 '10 at 17:12
1  
perhaps, but note that this only works if the files have no spaces in them. A more "safe" approach is find ... -exec chmod ... {} \; –  isaaclw Jul 18 '12 at 22:30
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.