Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Is there any equivalent of the Ubuntu tree command for Mac OS X ?

share|improve this question

migrated from stackoverflow.com Nov 21 '11 at 10:41

This question came from our site for professional and enthusiast programmers.

7 Answers 7

up vote 115 down vote accepted

Yes, there is, and it's called tree.

You can install it

  • from source, which could be problematic

  • by using any package manager, like Homebrew, MacPorts, or Fink (sorted in the order I would recommend). Install either of those first — just install one, not all.

    Then run one of the following commands, depending on which package manager you chose.

    brew install tree
    sudo port install tree
    fink install tree
    
share|improve this answer
    
shaunchapmanblog.com/post/329270449/… also seems to have detailed instructions but may cause issues with llvm-gcc living under /Developer if you are running Xcode 4.x; a bit of fiddling around should do the trick. –  Ahmed Masud Nov 21 '11 at 11:04
    
@slhck: Thanks! Installing Homebrew + brew install tree worked like a charm :) –  Misha Moroshko Nov 21 '11 at 22:13
    
@MishaMoroshko Glad it worked. You'll find many programs on Homebrew, so if you ever miss something you had on Ubuntu or thought only Linux can have, Homebrew should help you! –  slhck Nov 21 '11 at 22:15

I added the following to ~/.bash_profile for use in Terminal.app. Some comments are included to help remember how find is being used.

##########
## tree ##
##########
## example ...
#|____Cycles
#| |____.DS_Store
#| |____CyclesCards.json
#| |____Carbon
#| | |____Carbon.json
# alternate: alias tree='find . -print | sed -e "s;[^/]*/;|____;g;s;____|; |;g"'
# use$ tree ; tree . ; tree [some-folder-path]
function tree {
    find ${1:-.} -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
}

example for the current directory

$> tree

example for some path

$> tree /some/path
share|improve this answer

Not exactly the same, but one quick way on the Mac is:

find .

and that's it. It will list all file paths in the current directory as a list.

share|improve this answer

An alternative using find and awk:

#!/bin/bash
find . -print 2>/dev/null | awk '!/\.$/ { \
    for (i=1; i<NF; i++) { \
        printf("%4s", "|") \
    } \
    print "-- "$NF \
}' FS='/'
share|improve this answer

Or if your administrator won't let you install any of the brew, fink, port tools you can always build it from the source :

curl -O ftp://mama.indstate.edu/linux/tree/tree-1.5.3.tgz
tar xzvf tree-1.5.3.tgz
cd tree-1.5.3/
ls -al

Edit the Makefile to comment linux part and uncomment osx area:

# Linux defaults:
#CFLAGS=-ggdb -Wall -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
#CFLAGS=-O2 -Wall -fomit-frame-pointer -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
#LDFLAGS=-s

# Uncomment for OS X:
CC=cc
CFLAGS=-O2 -Wall -fomit-frame-pointer -no-cpp-precomp
LDFLAGS=
XOBJS=strverscmp.o

And while you're at it, if you want to force tree to always colorize the output, you can always edit the main method of the tree.c file and add force_color=TRUE before setLocale(LC_TYPE,"");

Finally hit make and you're done building tree for mac.

Tribute goes to Shaun Chapman for his original post on his blog.

share|improve this answer
    
Couldn't get to Shaun's website; thanks for the heads up on modifying the Makefile. –  Paul Nathan Oct 26 '12 at 14:27
    
Specifically, you can add force_color = TRUE;. No semicolon and you get a compile error. –  tgrosinger Sep 6 '13 at 15:55
1  
I've just built version 1.7 and instead of setLocale its setlocale. So in tree.c, you look for setlocale(LC_TYPE,""); and thanks! –  Avi Cohen May 2 at 9:49
    
Great answer. Can you add a note on how to move it to /bin (or some path so that it can be used globally)? –  Khanh Nguyen Oct 10 at 4:57

It's not as pretty as gnu tree ... but it's real easy to alias in bash ... You can even add a little color by tacking the G option on to osx's ls color.

alias tree='find . -type d | ls -lARG'
share|improve this answer

Hi: There isn't a tree command per se however you can do this:

Save the following script to /usr/local/bin/tree

#!/bin/bash

SEDMAGIC='s;[^/]*/;|____;g;s;____|; |;g'

if [ "$#" -gt 0 ] ; then
   dirlist="$@"
else
   dirlist="."
fi

for x in $dirlist; do
     find "$x" -print | sed -e "$SEDMAGIC"
done

chmod 755 /usr/local/bin/tree

and enjoy

Of course you may have to create /usr/local/bin

share|improve this answer
    
It misses all the options of tree, but still a nice little solution. –  slhck Nov 21 '11 at 11:01
    
@slhck hehe it was a quick hack solution... –  Ahmed Masud Nov 21 '11 at 11:05
    
You might want to quote your variables though. –  slhck Nov 21 '11 at 11:12
    
$x should be $dirlist shouldn't be quoted... because of the special expansion of "$@" –  Ahmed Masud Nov 21 '11 at 11:24
1  
@JenS. of course you can simply change the find command to deal with that –  Ahmed Masud Sep 24 at 20:41

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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