Chmod recursively Chmod recursively shell shell

Chmod recursively


You can use chmod with the X mode letter (the capital X) to set the executable flag only for directories.

In the example below the executable flag is cleared and then set for all directories recursively:

~$ mkdir foo~$ mkdir foo/bar~$ mkdir foo/baz~$ touch foo/x~$ touch foo/y~$ chmod -R go-X foo ~$ ls -l foototal 8drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bardrwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y~$ chmod -R go+X foo ~$ ls -l foototal 8drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bardrwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

A bit of explaination:

  • chmod -x foo - clear the eXecutable flag for foo
  • chmod +x foo - set the eXecutable flag for foo
  • chmod go+x foo - same as above, but set the flag only for Group and Other users, don't touch the User (owner) permission
  • chmod go+X foo - same as above, but apply only to directories, don't touch files
  • chmod -R go+X foo - same as above, but do this Recursively for all subdirectories of foo


You need read access, in addition to execute access, to list a directory. If you only have execute access, then you can find out the names of entries in the directory, but no other information (not even types, so you don't know which of the entries are subdirectories). This works for me:

find . -type d -exec chmod +rx {} \;


Try to change all the persmissions at the same time:

chmod -R +xr