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.
Last updated: March 18, 2024
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.
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.
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
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.
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
...
In case we’re interested in displaying only directories, we can use the -d (directories) flag:
$ tree -d
.
├── mydirectory1
│ └── letters
├── mymovies
└── mytrips
├── mydirexample
└── pictures
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
...
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
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.
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.
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.