97

I have ubuntu installed on my local computer with apache / php / mysql.

I now have a directory at /var/www - inside which I have several of my ongoing projects. I also work with opensource ( drupal, magento, sugarcrm ).

The problem I am facing is changing file permission with terminal. Sometime I need to change the permission of entire folder and its subsequent sub-folders and files. I have to individually change using

sudo chmod 777 foldername

How can I do this recursively.

Also why do I have to always do it 777, I tried 755 for folders and 644 for files, but that won't work.

5 Answers 5

132

Just add the -R option to recursively change the permissions of files. An example, recursively add read and write permissions for the owner and group on foldername:

chmod -R ug+rw foldername

Permissions will be like 664 or 775.

Setting the permissions to 777 is highly discouraged. You get errors in either Apache or your editor regarding permissions because apache runs under a different user (www-data) than you.

If you want to write to /var/www, add yourself to the www-data group and set umask+permissions accordingly.

  • Add yourself to the www-data group: sudo adduser $USER www-data
  • Change the ownership of the files in /var/www: sudo chown -R www-data:www-data /var/www
  • Change the umask, so newly created files by Apache grants write permissions to the group too. Add umask 007 to /etc/apache2/envvars.
  • Grant yourself (technically, the group www-data) write permissions: sudo chmod -R g+w /var/www.
3
  • yeah I was adding r flag in wrong place, I was adding it after the o+w for chmod. Jul 27, 2014 at 5:51
  • 1
    Also, if you try to use chmod -r blablabla (small -r instead of -R) You might end up removing read permissions for everyone... Jun 22, 2015 at 14:42
  • 1
    After these instructions, it's a good idea to check that there are no .htaccess files with write permissions for apache. find /var/www/ | grep .htaccess | xargs ls -l. Sep 25, 2018 at 2:10
32

bruteforce:

sudo find foldername -exec chmod a+rwx {} ";"

What does not work? Be more specific!

sudo find foldername -type d -exec chmod 755 {} ";"
sudo find foldername -type f -exec chmod 644 {} ";"
2
  • when you're inside the folder, remove "foldername"
    – Enrique
    Feb 11, 2014 at 13:12
  • 7
    ...and replace it with .
    – djjeck
    Dec 24, 2014 at 8:15
4

You can change the subfolders and files on Nautilus. As you can see on the image below. In order to have the permissons on buttons, you can enable the option on Ubuntu Tweak.

enter image description here

1
  • Use LANG=C [command] to get English translations.
    – Lekensteyn
    Mar 16, 2011 at 15:17
4

You should not need 777 for anything. Worst case, you'll need to change the owner of certain files and directories to the "www-data" user.

sudo find /var/www -type d -print0 | xargs -0 chmod 755
sudo find /var/www -type f -print0 | xargs -0 chmod 644
sudo find /var/www/some/subset -print0 | xargs -0 chown www-data:www-data

If you're using Lekensteyn's group membership method, change 755 to 775 and 644 to 664 respectively above, and then force the group stickiness:

sudo find /var/www/some/subset -type d -print0 | xargs -0 chmod g+s
1

If you want to have all of your files be readable to the world (ie. it's just a static set of HTML files/images), then use this command:

chmod -R a+r <base directory>

That will recursively go through all of the files & subdirectories and add read permission to them.

WARNING: Don't do this for files that are executable! Only files that should be visible by everybody.

2
  • Are you saying "don't do chmod -R a+x on anything", or "don't do chmod -R a+r on executables"?
    – aleclarson
    Dec 8, 2018 at 14:14
  • I fixed it. The later is true. Be careful about allowing others access to executables that you've created. Dec 8, 2018 at 15:49

You must log in to answer this question.

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