1. Overview
In this short tutorial, we’ll see how to follow symlinks when listing recursively all files in a directory.
To do that, *we can use tree, ls, or find*. We’ll run those three commands in the same directory so we can compare the output of each.
ls and find are common utilities on Linux and are usually installed by default. However, some distributions don’t install tree by default, but it can be installed through the package manager.
2. Using tree
When using tree, we are presented with a tree-like structure of files and directories.
We only have to add the parameter -l to enable following symlinks because tree always runs recursively:
$ tree -l
Let’s run tree in a folder called example that includes two symlinks — one to a folder and another one to a file:
$ tree -l example
example
├── Documents
│ ├── contract.pdf
│ ├── curriculumvitae.pdf
│ └── tictactoe_requirements.pdf -> ../sandbox/tictactoe/requirements.pdf
└── sandbox
├── mytetris -> ../../mytetris
│ ├── Makefile
│ ├── tetris.c
│ └── tetris.h
└── tictactoe
├── requirements.pdf
└── tictactoe.py
4 directories, 8 files
As we can see, example/sandbox/mytetris is a symlink to another folder, and tree followed it by showing its content. *Each symlink is identified with an arrow symbol (->) and its destination.*
If there’s a symlink making a loop, tree will print the message “recursive, not followed” and won’t follow it. This behavior is shared – with a similar message – by ls and find.
3. Using ls
We can also use ls to list the content recursively. We just have to include the parameters -R and -L to run it recursively and to follow symlinks, respectively:
$ ls -R -L
Let’s run it with the same folder we used with tree:
$ ls -R -L example
example:
Documents/ sandbox/
example/Documents:
contract.pdf curriculumvitae.pdf tictactoe_requirements.pdf
example/sandbox:
mytetris/ tictactoe/
example/sandbox/mytetris:
Makefile tetris.c tetris.h
example/sandbox/tictactoe:
requirements.pdf tictactoe.py
Remember from the previous example that example/sandbox/mytetris and example/Documents/tictactoe_requirements.pdf are symlinks. Notice in this case there is no visual indication of this.
Also, we don’t get the tree-like structure as with tree. We can use more parameters with ls like -l to have more information about the files and folders.
4. Using find
Finally, we have the option to use the find command. We only have to add -L to tell it to follow symlinks, as find will recursively list all files and directories by default:
$ find -L
We’ll use the same example as before but using find. Again, we won’t get any indication that sandbox/mytetris and Documents/tictactoe_requirements.pdf are symlinks:
$ find -L example
example
example/sandbox
example/sandbox/mytetris
example/sandbox/mytetris/Makefile
example/sandbox/mytetris/tetris.c
example/sandbox/mytetris/tetris.h
example/sandbox/tictactoe
example/sandbox/tictactoe/requirements.pdf
example/sandbox/tictactoe/tictactoe.py
example/Documents
example/Documents/contract.pdf
example/Documents/curriculumvitae.pdf
example/Documents/tictactoe_requirements.pdf
5. Conclusion
In this tutorial, we learned how to use the tree, ls, and find commands to follow symlinks.