Linux: HowTo See Directory Tree Structure

last updated in Categories , , , ,

How do list contents of directories in a structure like format under Linux operating systems?

You need to use command called tree. It will list contents of directories in a tree-like format. It is a recursive directory listing program that produces a depth indented listing of files. When directory arguments are given, tree lists all the files and/or directories found in the given directories each in turn. Upon completion of listing all files/directories found, tree returns the total number of files and/or directories listed.

tree command installation on a Linux

By default the tree command is not installed. Type the following command to install the same on a RHEL / CentOS / Fedora Linux using yum command:
# yum install tree
If you are using Debian / Mint / Ubuntu Linux, type the following apt-get command to install the tree command:
$ sudo apt-get install tree
If you are using Apple OS X, type:

brew install tree

tree command syntax

The syntax is:

tree /path/to/directory
tree [options]
tree [options] /path/to/directory

To list contents of /etc in a tree-like format:

tree /etc

Sample outputs:

|-- abrt
|   |-- abrt-action-save-package-data.conf
|   |-- abrt.conf
|   |-- gpg_keys
|   `-- plugins
|       |-- CCpp.conf
|       `-- python.conf
|-- acpi
|   |-- actions
|   |   `--
|   `-- events
|       |-- power.conf
|       `-- video.conf
|-- adjtime
|-- aliases
|-- aliases.db
|-- alsa
|   `-- alsactl.conf
|-- alternatives
|   |-- links -> /usr/bin/elinks
|   |-- links-man -> /usr/share/man/man1/elinks.1.gz
|   |-- mta -> /usr/sbin/sendmail.postfix
|   |-- mta-aliasesman -> /usr/share/man/man5/aliases.postfix.5.gz
|   |-- mta-mailq -> /usr/bin/mailq.postfix
|   |-- mta-mailqman -> /usr/share/man/man1/mailq.postfix.1.gz
|   |-- mta-newaliases -> /usr/bin/newaliases.postfix
|   |-- mta-newaliasesman -> /usr/share/man/man1/newaliases.postfix.1.gz
|   |-- mta-pam -> /etc/pam.d/smtp.postfix
|   |-- mta-rmail -> /usr/bin/rmail.postfix
|   |-- mta-sendmail -> /usr/lib/sendmail.postfix
|   `-- mta-sendmailman -> /usr/share/man/man1/sendmail.postfix.1.gz
|-- anacrontab
|-- asound.conf
|-- at.deny
|-- audisp
|   |-- audispd.conf
|   `-- plugins.d
|       |-- af_unix.conf
|       |-- sedispatch.conf
|       `-- syslog.conf
|-- audit
|   |-- auditd.conf
|-- xinetd.d
|   `-- rsync
|-- xml
|   `-- catalog
|-- yum
|   |-- pluginconf.d
|   |   |-- product-id.conf
|   |   |-- protectbase.conf
|   |   |-- rhnplugin.conf
|   |   `-- subscription-manager.conf
|   |-- protected.d
|   |-- vars
|   `-- version-groups.conf
|-- yum.conf
`-- yum.repos.d
    |-- epel.repo
    |-- epel-testing.repo
    |-- ksplice-uptrack.repo
    |-- redhat.repo
    `-- rhel-source.repo

208 directories, 1452 files

The -a option should be passed to see all files. By default tree does not print hidden files (those beginning with a dot ‘.’). In no event does tree print the file system constructs ‘.’ (current directory) and ‘..’ (previous directory).:

tree -a

To list directories only, run:

tree -d

Pass the -C option to see colorized output, using built-in color defaults:

tree -C

Sample outputs:

Fig.01: Linux tree Command To  Display Structure of Directory Hierarchy
Fig.01: Linux tree Command To Display Structure of Directory Hierarchy

Here is a list of all options supported by the tree program:

  -a            All files are listed.
  -d            List directories only.
  -l            Follow symbolic links like directories.
  -f            Print the full path prefix for each file.
  -i            Don't print indentation lines.
  -q            Print non-printable characters as '?'.
  -N            Print non-printable characters as is.
  -p            Print the protections for each file.
  -u            Displays file owner or UID number.
  -g            Displays file group owner or GID number.
  -s            Print the size in bytes of each file.
  -h            Print the size in a more human readable way.
  -D            Print the date of last modification.
  -F            Appends '/', '=', '*', or '|' as per ls -F.
  -v            Sort files alphanumerically by version.
  -r            Sort files in reverse alphanumeric order.
  -t            Sort files by last modification time.
  -x            Stay on current filesystem only.
  -L level      Descend only level directories deep.
  -A            Print ANSI lines graphic indentation lines.
  -S            Print with ASCII graphics indentation lines.
  -n            Turn colorization off always (-C overrides).
  -C            Turn colorization on always.
  -P pattern    List only those files that match the pattern given.
  -I pattern    Do not list files that match the given pattern.
  -H baseHREF   Prints out HTML format with baseHREF as top directory.
  -T string     Replace the default HTML title and H1 header with string.
  -R            Rerun tree when max dir level reached.
  -o file       Output to file instead of stdout.
  --inodes      Print inode number of each file.
  --device      Print device ID number to which each file belongs.
  --noreport    Turn off file/directory count at end of tree listing.
  --nolinks     Turn off hyperlinks in HTML output.
  --dirsfirst   List directories before files.
  --charset X   Use charset X for HTML and indentation line output.
  --filelimit # Do not descend dirs with more than # files in them.

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

14 comment

  1. I get “âââ” instead of showing the fancy ” |– ”
    I’m using Debian with Swedish character setup…

      1. Sorry for spamming, but I discovered that if you use PuTTY you can change character setup to UTF-8 and all colors and even åäö works :D

  2. This one is pretty cool without external packets. ☺

    ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
    1. Oh yes, parsing ls output is so robuste, forking 2 subshells is so quick too !
      tree definitely looks like a good little tool for this purpose.

  3. How to print files with this??

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

    Have a question? Post it on our forum!