To change file access permissions you need to use the chmod command. It has -R or –recursive option that change files and directories recursively. [donotprint]
Tutorial details | |
---|---|
Difficulty | Easy (rss) |
Root privileges | No |
Requirements | None |
Time | 2m |
chmod Command Examples
In this example, you are setting permission to 0755:
$ chmod -R 0755 directoryNameHere
However, if you need to apply conditional file permissions recursively, you need to use combination of the find and chmod command. To find all files in /home/user/demo directory, enter:
$ find /home/user/demo -type f -print
To find all files in /home/user/demo directory with permission 777, enter:
$ find /home/user/demo -type f -perm 777 -print
Finally, apply new permission using the -exec option as follows:
$ find /home/user/demo -type f -perm 777 -print -exec chmod 755 {} \;
To select directories and subdirectories use the following syntax:
$ find /var/www/html -type d -perm 777 -print -exec chmod 755 {} \;
Sample Shell Script To Change Permission Recursively
#!/bin/bash # Purpose: Set correct webserver files and dir permissions # Author: Vivek Gite < vivek@nixcraft.com > # This script is released under GPL version 2.0 or above # Set root permission as follows for the Apache / Lighttpd / Nginx DocumentRoot # + Dirs/Subdirs: read-only and execute to others # + Files: read-only permission # Tested on Debian Linux v3/4/5/6 and RHEL v2/3/4/5/6 # ------------------------------------------------------------------------------------------------- _dir="${1:-.}" _fperm="0444" _dperm="0445" _ugperm="root:root" _chmod="/bin/chmod" _chown="/bin/chown" _find="/usr/bin/find" _xargs="/usr/bin/xargs" echo "I will change the file permission for webserver dir and files to restrctive read-only mode for \"$_dir\"" read -p "Your current dir is ${PWD}. Are you sure (y / n) ?" ans if [ "$ans" == "y" ] then echo "Changing file onwership to $_ugperm for $_dir..." $_chown -R "${_ugperm}" "$_dir" echo "Setting $_fperm permission for $_dir directory...." $_chmod -R "${_fperm}" "$_dir" echo "Setting $_dperm permission for $_dir directory...." $_find "$_dir" -type d -print0 | $_xargs -0 -I {} $_chmod $_dperm {} fi
You can run this script as follows:
./script /var/www/html/
./script /usr/lib/cgi-bin/
🐧 Get the latest tutorials on Linux, Open Source & DevOps via:
- RSS feed or Weekly email newsletter
- Share on Twitter • Facebook • 20 comments... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
Thanks a lot for the tutorial. Now I can change the permission of a folder and its subfolders without affecting files inside. i.e.:
$ find folder_name -type d -exec chmod 775 ‘{}’ \;
I found this page by googling.
Thanks for your help!
Thanks for this amazing commands…!
Hi this was excellent I used what you had here to change my permissions
I changed it a little to work the way I wanted, which was to change all in the path to permissions I wanted, also works for ownership.
Use this method for Chown:
find . /home/admin/data/ -type d -exec chown admin.admin {} \;
find . /home/admin/data/ -type f -exec chown admin.admin {} \;
Public_html
find . /home/admin/public_html/ -type d -exec chmod 755 {} \;
find . /home/admin/public_html/ -type f -exec chmod 644 {} \;
Thanks! I used it this way, after changing uid for a user:
find -gid 1000 -exec chown -h :username {} \;
Excellent. Finally after weeks of searching this worked like a charm. Using the opportunity:
– Is there a way to search (for example) all files with permission 700 and select all that are NOT 700 ? I mean inverse selection.
I thank you so much for highlighting this wonderful command.
If you use gnome you can also do graphical way in nautilus. Do as follow:
1) open gconf (for example in terminal or Alt+F2)
2) in gconf-editor under /apps/nautilus/preferences select “show_advanced_permissions”
3) close, open nautilus, right click on folder or file, select permissions and enjoy… :)
Thank you, that’s cool.
Do not do what I did. In a brief moment of aloofness, I happened to mistake “./” with “/.”
The “./” means this directory while the latter “/.” means root… where all the apps are installed…
:(
Thnx man, that’s a good point : )
Still wondering warys to accomplish the task in cuteftp
Great help, thank you.. I rsynced to server with -a [archive] switch and it changed the file permissions so smb didn’t work any longer… Anyway, thank you again.
hi all.
Having a great pleasure for the above posted answer,but i have got a doubt that
how would we change the permission for some specific files having only read permission
to both read and execute through shell script.
Hey Vivek,
I went trawling the web for an elegant and simple solution to this and decided to write a little script for this myself.
It basically does the recursive chmod but also provides a bit of flexibility for command line options (sets directory and/or file permissions, or exclude both it automatically resets everything to 755-644). It also checks for a few error scenarios.
Check it out:
http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html
Hope it helps!
Thank you. This really helped me
Ty for article, really looking for permissions important.
This has saved me a lot time and trouble. Thank you for sharing this information.
default system setting is 022,
Is there a way we can change the umaskmode for individual users?
Example:
Any directory/file created by srv-test would have a umask of 002 results if dir/file permissions of rwxrwxr-x.
any script or something that is use for this,
user/dir/file have same permission i.e. 755.
all the directory and file inside the user have same permission.755
use the command _________________ to remove read, write, and execute permissions for other users from all files (ONLY FILES NOT DIRECTORIES)