6

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

4
  • I'm thinking a find, specifying either directory or file flags, with an -exec to chmod...
    – ewwhite
    May 4, 2012 at 18:01
  • 1
    what do you mean by all find solutions are too long ?
    – user9517
    May 4, 2012 at 18:06
  • Too long for being 'handy' to type at once :)
    – kolypto
    May 4, 2012 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, 2012 at 21:30

6 Answers 6

15

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

3
  • 1
    This option is in the POSIX standard, right? May 4, 2012 at 18:16
  • At least it works in Linux :)
    – kolypto
    May 4, 2012 at 19:08
  • not working for me even on linux. chmod -R ug+rwX,o+rX,o-w . would have worked.
    – Jean Paul
    Jan 10, 2023 at 13:32
8

Better, shorter, fancier than what ?

cd /directory
find . -type d -exec chmod 0755 {} +
find . -type f -exec chmod 0664 {} +
7
  • aaaw you beat me to it :( May 4, 2012 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, 2012 at 21:27
  • @BMDan: strange as it may seem - it's safe with spaces - I tested it.
    – user9517
    May 4, 2012 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, 2012 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, 2012 at 21:34
4

Adding a oneliner to the mix

find -type f -exec chmod 0644 {} + -o -type d -exec chmod 0755 {} +
3
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

1

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 .
1
  • Does not answer the question. However, useful :)
    – kolypto
    May 4, 2012 at 18:15
1

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?

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .