21

I want to simulate a tree command using Shell Script that displays all the directories recursively in this format:

.
|-- Lorem
|-- Lorem
|-- Lorem
    |-- Lorem
    |-- Lorem
|-- Lorem
`-- Lorem

How can I do that?

5 Answers 5

33

Try doing this (not exactly the same output, but very close) :

find ./ -type d -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

From http://mlsamuelson.com/content/tree-approximation-using-find-and-sed

with

find . -type d -print 2>/dev/null|awk '!/\.$/ {for (i=1;i<NF;i++){d=length($i);if ( d < 5  && i != 1 )d=5;printf("%"d"s","|")}print "---"$NF}'  FS='/'

See http://www.unix.com/shell-programming-scripting/50806-directory-tree.html

1
  • Awesome! But how can I do that using awk instead of sed?
    – Zeno Rocha
    Commented Jan 10, 2013 at 17:47
15

You can just launch :

tree .

OR

tree $absolute/path/of/your/dir

If you want to display the hidden files.

By default tree does not print hidden files (those beginning with a dot '.'), just type:

tree -a .

This is what tree command do.

3
  • 10
    Have you read the question? "I want to simulate a tree command using..."
    – Zeno Rocha
    Commented Jun 8, 2016 at 22:38
  • One explanation is that some linux machines are blocked from downloading tree, and need a DIY solutions. Commented Nov 28, 2022 at 14:55
  • The tree command doesn't "simulate" the tree command. It IS the tree command, so no soup for you. Commented Jun 19, 2023 at 22:13
4

Modifying sputnick's answer to get closer to your original format (which I prefer):

find ./ -type d -print | sed -e 's;[^/]*/; /;g;s;/ ;    ;g;s;^ /$;.;;s; /;|-- ;g'

The only difference now is the last line doesn't start with a backtick:

.
|-- Lorem
|-- Lorem
|-- Lorem
    |-- Lorem
    |-- Lorem
|-- Lorem
|-- Lorem

with

find . -type d -print 2>/dev/null | awk '!/\.$/ {for (i=1;i<NF-1;i++){printf("    ")}printf("|-- ")};{print $NF}' FS='/'
4

Modified base on the awk one from http://www.unix.com/shell-programming-scripting/50806-directory-tree.html

pwd;find . -type d -print 2>/dev/null|awk '!/\.$/ {for (i=1;i<NF-1;i++){printf("│   ")}print "├── "$NF}'  FS='/'

Output looks more similar to tree:

/etc
├── sudoers.d
├── susehelp.d
│   ├── htdig
├── sysconfig
│   ├── SuSEfirewall2.d
│   │   ├── services
│   ├── network
│   │   ├── if-down.d
│   │   ├── if-up.d
│   │   ├── providers
│   │   ├── scripts
│   ├── scripts
├── sysctl.d
├── systemd
│   ├── system
│   │   ├── default.target.wants
│   │   ├── getty.target.wants
│   │   ├── multi-user.target.wants
0

ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^/]*//--/g' -e 's/^/ /' -e 's/-/|/'

taken from here: http://www.centerkey.com/tree/

Not the answer you're looking for? Browse other questions tagged or ask your own question.