I'd like to recursively chmod a directory so that:

  • Files are 0664
  • Directories are 0775

How to do it better, shorter, fancier? :) Maybe, use umask somehow?

All find solutions are too long: I always end with Copy-Paste :)

  • I'm thinking a find, specifying either directory or file flags, with an -exec to chmod... – ewwhite May 4 '12 at 18:01
  • 1
    what do you mean by all find solutions are too long ? – user9517 supports GoFundMonica May 4 '12 at 18:06
  • Too long for being 'handy' to type at once :) – kolypto May 4 '12 at 18:12
  • 1
    If you're doing this so frequently that you can't be subjected to the numbing repetition of the few extra characters of a simple find, it begs the question: why not fix the permissions via umask (or some program-specific option) so that they're correct in the first place? – BMDan May 4 '12 at 21:30

Depending on your version of chmod, you may be able to do this:

chmod -R . ug+rwX,o+rX,o-w

Note the capital X. This sets the executable bit on directories and files that already have any of the execute bit already set.

Note that you can only use capital X with '+', not '=' or '-'.

  • 1
    This option is in the POSIX standard, right? – Dmitri Chubarov May 4 '12 at 18:16
  • At least it works in Linux :) – kolypto May 4 '12 at 19:08

Better, shorter, fancier than what ?

cd /directory
find . -type d -exec chmod 0755 {} +
find . -type f -exec chmod 0664 {} +
  • aaaw you beat me to it :( – Lucas Kauffman May 4 '12 at 18:02
  • Dangerous with files whose names contain certain reserved characters (like spaces, depending on your version of find). Consider -print0 and xargs -0. – BMDan May 4 '12 at 21:27
  • @BMDan: strange as it may seem - it's safe with spaces - I tested it. – user9517 supports GoFundMonica May 4 '12 at 21:30
  • @Iain: I recently discovered this behavior, but I'm not insignificantly baffled by it, and I'm pretty sure find hasn't always worked this way. Thus, my "depending on your version" disclaimer. – BMDan May 4 '12 at 21:32
  • @BMDan in the event that find broke up any filenames with spaces (Which I run in to all the time) how would you use -print0 to fix it in this particular situation? – Safado May 4 '12 at 21:34

Adding a oneliner to the mix

find -type f -exec chmod 0644 {} + -o -type d -exec chmod 0755 {} +
find /dir -type f -print0 |xargs -0 chmod 0644
find /dir -type d -print0 |xargs -0 chmod 0775

Test it before use it in real environment


I am using this for anything copied from FAT filesystems:

chmod -R a-x+X .

If it does not work, for example on Mac OS X, try the GNU version of the command chmod:

gchmod -R a-x+X .
  • Does not answer the question. However, useful :) – kolypto May 4 '12 at 18:15

Without knowing more about why you're trying to do this, the most common reasons people tend to use are either:

  • Files and directories are other-writeable

    chmod -R o-w /path/to/dir

  • Files and directories are not group-writeable

    chmod -R g+w /path/to/dir

Or, combine the two:

chmod -R o-w,g+w /path/to/dir

Alternately, if you want files and directories to the correct permissions by default, modify the creating process's umask.

Basically, it's a rare day that it's correct to use numeric modes with chmod; typically, directories already have the executable bit set and files that don't need it lack it, so why muck around with it at all when the + and - operators obviate the need to do so?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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