Black Friday 2025 – NPI EA (cat = Baeldung on Linux)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

Baeldung Pro – Linux – NPI EA (cat = Baeldung on Linux)
announcement - icon

Learn through the super-clean Baeldung Pro experience:

>> Membership and Baeldung Pro.

No ads, dark-mode and 6 months free of IntelliJ Idea Ultimate to start with.

Partner – Orkes – NPI EA (tag=Kubernetes)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

1. Introduction

In this tutorial, we’ll discuss different ways to display a directory structure’s contents recursively in Linux. We’ll first look at a couple of built-in commands, and then we’ll explore the Linux tree command and the options it provides for printing a directory structure as a tree.

2. Using ls and find

Firstly, let’s explore some built-in commands. The first one is ls -l -R (recursive), let’s have a look:

$ ls -lR
.:
total 4
drwxr-xr-x 10 ubuntu ubuntu 4096 Apr 29 18:21 ubuntu

./ubuntu:
total 12
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 29 10:30 mydirectory1
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 29 10:43 mymovies
drwxrwxr-x 4 ubuntu ubuntu 4096 Apr 29 16:28 mytrips

./ubuntu/mydirectory1:
total 4
-rw-rw-r-- 1 ubuntu ubuntu    0 Apr 29 10:30 file1
-rw-rw-r-- 1 ubuntu ubuntu    0 Apr 29 10:30 file2
-rw-rw-r-- 1 ubuntu ubuntu    0 Apr 29 10:30 file3
...

And the second option is using find:

$ find
.
./ubuntu
./ubuntu/.bash_history
./ubuntu/.lesshst
./ubuntu/.config
./ubuntu/.config/mc
./ubuntu/.config/mc/panels.ini
./ubuntu/.config/mc/ini
./ubuntu/.bash_logout
...

The output from these commands is less visual, but depending on our requirements, they’ll provide us with the same information.

3. Installing the tree Command

The tree command is a Linux program that lists our directories and files in a more helpful way resembling a tree structure.

Since tree is not installed by default, we’ll need to install it with apt-get or yum.

If we’re using Debian or Ubuntu, we can install tree using apt:

$ sudo apt install tree

If we’re using Red Hat, CentOS, or Fedora, we can use yum:

$ sudo yum install tree

4. Using the tree Command

4.1. Default Behavior

Once we’ve installed the tree command, we can list our directories and files in a tree format.

Executed with no arguments, it’ll print the structure of our current directory, including all subdirectories and files that are not hidden:

$ tree
.
└── ubuntu
    ├── mydirectory1
    │   ├── file1
    │   ├── file2
    │   ├── file3
    │   ├── file4
    │   └── letters
    │       ├── books
    │       ├── magazines
    │       └── readme
    ├── mymovies
    │   ├── comedy
    │   ├── drama
    │   ├── terror
    │   └── thriller
    └── mytrips
        ├── mydirexample
        │   └── file.txt
        └── pictures
            ├── Australia
            ├── France
            ├── Germany
            ├── Japan
            └── USA

7 directories, 17 files

We can clearly see a tree structure of all the directories, subdirectories, and files, connected by lines to improve visualization.

Let’s have a look at the most common flags we can use with the tree command.

4.2. Include Hidden Files and Directories

To include hidden directories and files in the output, we’ll use the -a (all) flag:

$ tree -a
.
└── ubuntu
    ├── .bash_history
    ├── .bash_logout
    ├── .bashrc
    ├── .cache
    │   ├── mc
    │   │   └── Tree
    │   └── motd.legal-displayed
    ├── .config
    │   └── mc
    │       ├── ini
    │       └── panels.ini
    ├── .gnupg
    │   └── private-keys-v1.d
    ├── .lesshst
    ├── .local
    │   └── share
    │       └── mc
    │           └── history
    ├── .profile
    ├── .ssh
    │   ├── DETELEME
    │   └── authorized_keys
    ├── .sudo_as_admin_successful
    ├── .viminfo
    ├── mydirectory1
    │   ├── file1
    │   ├── file2
    │   └── letters
...

4.3. Print Directories Only

In case we’re interested in displaying only directories, we can use the -d (directories) flag:

$ tree -d
.
├── mydirectory1
│   └── letters
├── mymovies
└── mytrips
    ├── mydirexample
    └── pictures

4.4. Include Paths

We can also display just the directories by using the -df (directories and full path) flag. We’ll see that it’s the same as -d, but the output will show us the relative path, from the current directory, of each directory that it finds:

$ tree -df
.
└── ./ubuntu
    ├── ./ubuntu/mydirectory1
    │   └── ./ubuntu/mydirectory1/letters
    ├── ./ubuntu/mymovies
    └── ./ubuntu/mytrips
        ├── ./ubuntu/mytrips/mydirexample
        └── ./ubuntu/mytrips/pictures

If we provide the full path of the starting directory, the -df option will show the full path of each directory:

$ tree -df /home/ubuntu/mytrips
/home/ubuntu/mytrips
├── /home/ubuntu/mytrips/mydirexample
└── /home/ubuntu/mytrips/pictures

We can use only the -f (full path) flag if we also want to see the files:

$ tree -f
.
├── ./mydirectory1
│   ├── ./mydirectory1/file1
│   ├── ./mydirectory1/file2
│   ├── ./mydirectory1/file3
│   ├── ./mydirectory1/file4
│   └── ./mydirectory1/letters
│       ├── ./mydirectory1/letters/books
│       ├── ./mydirectory1/letters/magazines
│       └── ./mydirectory1/letters/readme
├── ./mymovies
│   ├── ./mymovies/comedy
│   ├── ./mymovies/drama
...

4.5. Limit Number of Levels to Print

Imagine that we have a structure of hundreds of directories and subdirectories, but we only want to display until the second level of our subdirectories. We can define how many levels to display by using the -L (level) flag followed by the number of levels to visualize:

$ tree -L 2
.
└── ubuntu
    ├── mydirectory1
    ├── mymovies
    └── mytrips

4.6. Print Permissions and Sizes

Now we’re interested to see the information about file permissions and space used. We can do this using the -p (permissions) and -h (human) flags, respectively:

$ tree -ph
.
└── [drwxr-xr-x 20.0K]  ubuntu
    ├── [drwxrwxr-x 50.0K]  mydirectory1
    │   ├── [-rw-rw-r--    25.0K]  file1.txt
    │   ├── [-rw-rw-r--    75.0K]  file2.txt
    │   ├── [-rw-rw-r--    10.0K]  file3.txt
    │   ├── [-rw-rw-r--    0]  file4.txt
    │   └── [drwxrwxr-x 4.0K]  letters
    │       ├── [-rw-rw-r--   13]  books
    │       ├── [-rw-rw-r--    0]  magazines
    │       └── [-rw-rw-r--    0]  readme
    ├── [drwxrwxr-x 13.0K]  mymovies
    │   ├── [-rw-rw-r--    0]  comedy
    │   ├── [-rw-rw-r--    6.0K]  drama
    │   ├── [-rw-rw-r--    100M]  terror
    │   └── [-rw-rw-r--    0]  thriller
    └── [drwxrwxr-x 22.0K]  mytrips
        ├── [drwxrwxr-x 4.0K]  mydirexample
        │   └── [-rw-rw-r--    20M]  file.txt
        └── [drwxrwxr-x 16.0K]  pictures
            ├── [-rw-rw-r--    0]  Australia
            ├── [-rw-rw-r--    1.0M]  France
            ├── [-rw-rw-r--    5.0K]  Germany
            ├── [-rw-rw-r--    0]  Japan
            └── [-rw-rw-r--    11.0M]  USA

As we can see, it shows the same data as ls -lah but in a tree format.

4.7. Print Tree in JSON Format

The last option in this lesson is to print our directories and files in JSON (JavaScript Object Notation) format using the -J flag. This format is preferred for data exchange or if we need to process command output:

$ tree -J
[{"type":"directory","name": ".","contents":[
    {"type":"directory","name":"ubuntu","contents":[
      {"type":"directory","name":"mydirectory1","contents":[
        {"type":"file","name":"file1"},
        {"type":"file","name":"file2"},
        {"type":"file","name":"file3"},
        {"type":"file","name":"file4"},
        {"type":"directory","name":"letters","contents":[
          {"type":"file","name":"books"},
          {"type":"file","name":"magazines"},
          {"type":"file","name":"readme"}
        ]}
      ]}
    ]}
...
}]

If we want to review all the possibilities of the tree command, we can type man tree in our terminal and explore all the options.

5. Conclusion

In this article, we learned how to list our directories and files in a visually appealing format using the tree command with different flags. We also described two useful alternatives that provide the same information in a simpler format.