chmod is commonly used in Linux to change the permissions of files and folders. In this article, I’ll show you how to use it recursively – namely how to change the permissions of an entire directory, its subdirectories, and all the files within each at the same time. In addition, I’ll show you some use-case scenarios of why you would want to do this, some tips and best practices, and some potentially dangerous pitfalls you may fall into while using such a powerful command.
File permissions are important because they determine what actions users and groups can take. It’s a security measure, rooted in the core of Linux architecture. While this is a basic overview, it varies greatly between operating systems. For example, the permission structure of Windows systems diverges greatly from the one in Linux. In many ways, Linux’s permissions scheme is simpler to understand and implement.
So let’s get started.
How to Use chmod Recursively
To get started, here’s how you would use the chmod command to change the permissions of a directory recursively:
chmod -R u+x directory_name
The above command can be broken down as follows:
chmod: The command for changing the file permissions
– R: This specifies that the command is recursive
u+x: This means that I want to give execute permissions (x) to the user (u)
directory_name: This is the name of the root directory from which I want to start applying permissions.
Let’s see an example of this in action. Here’s a screenshot of a directory and subdirectory structure I created with the default permissions:
Currently, none of the files have execute (x) permissions. The directories, on the other hand, are all executable, which is necessary if we want to open them (cd) and access the contents of their files. Interestingly, you don’t need execute permissions to merely list the names of a directory’s contents, for which we need the read (r) permission, instead.
I use the following command above, changing only the name of the directory to suit the example:
chmod -R u+x test_folder
Now I once again list the permissions of the directory and its subfolders:
ls -lR test_folder
And here’s the output:
As you can see, the permissions for the files are now:
-rwxrw-r–
Since the permissions are read in the order of user, group, and other, the permissions of the user or owner of the files are:
rwx
Which includes the execute (x) permission. You can also see that this change has been applied not just to the files of the directory in question, but to all the files in the subfolders within it. Thanks to the magic of recursion, we don’t need to enter into the subfolders individually to make the change. As we’ll see below, this can be a massive time saver when you need to perform common operations.
If I wanted all the files to also be executable by the group and “other”, I would have modified the above command like this:
chmod -R ugo+x test_folder
The above command assigns the execute permission to everyone. As we’ll see below, doing so can be dangerous and often violates the principle of least privilege in Linux, which states that each entity must only be assigned those permissions that they need to carry out their task and nothing more. Adding additional, useless privileges, increases the risk of an attack, even if the user themselves isn’t malicious.
Efficiency of Recursive Operations
Luckily, Linux doesn’t use the inefficient “last in first out” stack-like algorithm we learn about in class for its directory traversal. Instead, the algorithm moves iteratively and processes the file and folder permissions as they appear. So even with large directory trees and deeply nested hierarchies, the chmod recursive process is highly efficient.
Practical Uses for chmod Recursive
While administering a Linux server, you’ll always use the recursive chmod functionality. The ability to quickly change the permissions for hundreds or thousands of files and directories is invaluable in a number of practical use cases. Here are some of them.
Uploading New Files to a Web Server
Let’s say you’ve created a brand new site and want to upload the portfolio of your images to it. Or your site already exists on your development machine and it’s time to migrate them over to the new server. You can find a tutorial on how to migrate files to a new server using cPanel on the NameHero blog.
Any web server, whether it’s Apache or something else, requires files and folders to have specific permissions for specific users to enable the server to read, traverse, write, and execute files. This doesn’t mean that it requires all permissions for everything, however. Here are the permissions that Apache needs:
- Read permissions for all users, groups, and others
- Execute permissions for all directories on the website
- Write permissions when necessary
After transferring files to the new web server, you must ensure that all the files and folders have these permissions. A website can easily contain thousands of files and folders, and you need the chmod recursive function in order to efficiently change the permissions.
For example, to grant read permissions to all files, we use the following command:
chmod -R ugo+r /path/to/webapp
And similarly, for directories, we can use the following command in conjunction with the “find” command to set execute permissions for directories:
find /path/to/webapp -type d -exec chmod ugo+x {} +
Note that we don’t want to set execute permissions for all the files. And because we’re using “find”, we don’t need to use the explicitly recursive -R function since we can just process each directory one by one with “find”.
Setting up a Development Environment
While developing a project, we need to ensure that the files and folders are accessible to the tools we use for development. The IDE and build tools, for example, must be able to read, write, and execute all the necessary files.
File Sharing and Collaboration
If you’re working collaboratively on a project, then you need to ensure that the various members of your group have access to the right files and folders. Depending on the situation, you might assign the members of your team to the group assigned to the files, and then give them read or write permissions in bulk.
Preparing for Backup Restoration
If you run a backup script that restores files and folders from a data store, the script needs permissions to read, and write and might even need execute permissions so it can do its job. If you have thousands of files backed up, the using chmod recursively can complete the task in seconds.
This is one of those edge-case situations where it’s easy to overlook the role played by permissions.
Conclusion
In addition to the above scenarios, there are many other situations where you’ll need to change the permissions of a large number of files and folders. I hope the above examples and code will help you get started so you can hit the ground running!
Managing permissions can be tricky, and they can trip you up when you least expect it. Using chmod recursively can help you to quickly fix the big mistakes and save you a lot of time!
I’m a NameHero team member, and an expert on WordPress and web hosting. I’ve been in this industry since 2008. I’ve also developed apps on Android and have written extensive tutorials on managing Linux servers. You can contact me on my website WP-Tweaks.com!
Leave a Reply