Funnily enough macOS does not come with the shell command tree
. Tree is the handy little command-line program, which lists the directory structure and files contained within. There are ways to install it with third-party tools, but those tools have failed me one time too many, so I have moved away from them.
Creating a makeshift tree
The “official” tree command comes with a multitude of options, but I really never use them, so almost the bare minimum is enough.
I use zsh as my shell, so I created this shell alias to my .zshrc
file.
alias tree="pwd && find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"
Now, when I run tree
in a directory, I will get the familiar output:
> devs/projects/gis > tree
/Users/me/devs/projects/gis
.
|____.DS_Store
|____requirements.txt
|____images
| |____a2
| |____a1
|____shapefiles
| |____a1.shp
| |____a2.shp
|____README.md
|____requirements-dev.txt
|____app.py
|____venv
| |____bin
| | |____pip3.7
| | |____python3
| | |____easy_install
| | |____python
| | |____pip3
| | |____activate.fish
| | |____easy_install-3.7
| | |____python3.7
| | |____pip
| | |____activate
| | |____activate.csh
| |____include
| |____pyvenv.cfg
| |____lib
| | |____python3.7
| | | |____site-packages
--- OUTPUT CUT MANUALLY ---
As you may notice, this has an issue. When run within a development project directory, which containes either a Python virtual environment (venv
in this case) or node_modules
in a JS project, the output gets really verbose. In almost every case, I do not want to see those directories, just my own files and subdirectories instead.
To make this happen, I created also tree2
, like so:
alias tree2="pwd && find . -type d \( -path ./node_modules -o -path ./venv \) -prune -o -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"
This is pretty much the same thing, but it — a bit naively — will skip the top-level directories venv
and node_modules
. When run, it will return the result I want:
> devs/projects/gis > tree2
/Users/me/devs/projects/gis
.
|____.DS_Store
|____requirements.txt
|____images
| |____a2
| |____a1
|____shapefiles
| |____a1.shp
| |____a2.shp
|____README.md
|____requirements-dev.txt
|____app.py
As you can see, sometimes you don’t need to install a huge pile of tools one on top of each other to accomplish what you need. Plus, this was a fun little excercise on shell scripting!