7

all. I'm looking for a quick and dirty way to generate some diagrams of some directories that have almost, but not exactly, the same hierarchy, so I can show them around at a meeting and we can decide which flavor we like best. I'm not interested in the "leaf" nodes, just the directories.

The catch: I don't want to mess with X. This is a server system I deal with entirely through SSH. So I'm looking for something that will do ASCII layout, maybe with simple pipes-and-hyphens for lines or something.

Does anyone know of such a utility? I'm sure I could write something myself, but it's such a fiddly little sort of project, with handling spacing and layout and such; I'd really like to discover that someone's done it for me. Alas, Google doesn't seem to know of such a thing...or if it does, it's hidden beneath heaps of excellent visual explications of the standard general Unix file hierarchy. Thanks!

Jenn D.
  • 181
  • 1
  • 5

2 Answers2

28

I would use tree.

$ tree -d /usr|head -n 12
/usr
|-- X11R6
|   `-- lib
|       `-- X11
|           `-- wily
|-- bin
|   `-- X11 -> .
|-- games
|-- i586-mingw32msvc
|   |-- bin
|   |-- include
|   |   |-- GL
Dennis Williamson
  • 60,515
  • 14
  • 113
  • 148
  • Perfect! Exactly what I was looking for. It's amazing how hard it is (at least for me) to find the simple little stuff in Unix sometimes. man -k directory didn't do it -- but man -k directories would have. Thanks again! – Jenn D. May 22 '10 at 18:18
  • @Jenn: That's why I use a common root portion of a word for that kind of query `apropos director` (or `man -k director`) will find both. It works to include various prefixes as well: `apropos known` finds "known", "unknown" and "well-known". – Dennis Williamson May 22 '10 at 18:43
  • And `tree` also works on Windows. – Mark Tomlin Jun 04 '12 at 17:48
  • Using `tree` (version 1.5.3) I get some unicode characters to make the diagram look prettier. To get only ascii characters, I had to use `tree --charset ascii` – jcollado Aug 20 '12 at 12:30
  • Not directly related, but there's also [`pstree`](http://unixhelp.ed.ac.uk/CGI/man-cgi?pstree+1). Tree is one of those programs like `top`; there are a number of fun variants. – Parthian Shot Aug 05 '14 at 20:18
  • Works just fine on Mac also, `brew install tree` first. – nick.graziano Aug 11 '17 at 21:01
5

If you don't have tree you could use this linux/unix command:

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

You can also make a shell script see details here.

Explanation for the above command:

ls -R list all directories, sub-directories,

Explanation ls -R list all the file and directories recursively

ex:

./sys/devices/platform/ag71xx.0/net/eth0:
addr_assign_type  device            iflink            speed


./sys/devices/platform/ag71xx.0/net/eth0/queues:
tx-0

grep ":$" filters only the files that have : before line end, thus remains, something like.

./sys/devices/platform/ag71xx.0/net/eth0:
./sys/devices/platform/ag71xx.0/net/eth0/queues:

Then a series of multiple command are passed using -e switch to sed

's/:$//' strips all the trailin :

's/[^-][^\/]*\//--/g' leaves only what is between / - and replace each with --

the rest two command add a few spaces and a |

The result is something like:

   |-----------eth0
   |-------------queues
Eduard Florinescu
  • 831
  • 5
  • 24
  • 39