A Timeless Directory Layout for All of your Projects

Posted on Sun 31 May 2020 in linux

Directory layouts are like log cabins that start from a basic shed, gradually adding a room at a time. When you start out on UNIX, everything gets thrown in your home directory. Over time you start to develop a structure for your sources, binaries, projects, data files (like CSV, images, tar files), config, etc

My layout is called TDL -- because it allows me to juggle open source projects, partnerships and jobs in a consistent structure across machines and time.

~/
│── .cfg          # bare git repo with my dotfiles
│── local         # e.g. make install --prefix=~/local
│     - lib, bin, man  
│── .trash        # files to delete#  VARIOUS DIRECTORIES WITH REPOS
│── src           # clone public open source repos, e.g. for contribution, research or debugging
│── stellar       # personal repositories
│     - archive   # hold tgz of repos to save space and indexing
│     - repo1
│     - repo2
│─- apple             # contains repos for a previous company
│── microsoft         # repos from another company , consulting project, charity effort

.cfg

Store your dotfiles using the git bare repo technique. this way your config travels with you. If you have host-specific config, either test for the hostname e.g. in your .bashrc, or git checkout -b $(hostname)

local

e.g. make --prefix=~/local -- install binaries, libs, man pages into your home directory. Add $HOME/local/bin to your path with export PATH=$PATH:$HOME/local/bin The contents are machine specific

Storing Repos

Within your home dir, choose "business names" , e.g. for my personal work it's stellar, open source is src and then a directory each for businesses like apple , microsoft etc

Archiving Sources

Sources get huge, so archive them with tar -czf archive/repo1.tgz repo1 && rm -rf repo1

Syncing Files Across Hosts

most sources will be synced via your git repo, but for large files (e.g. a 5gb csv), generally you'll rsync

Add the alias to your .ssh/config so you can quickly send files among machines. Naturally commit that into your .cfg repo

e.g.

cat ~/.ssh/config
Host cloud9-env1
        User ec2-user
        IdentityFile ~/.ssh/id_rsa
        Hostname cloud9-env1.tonymet.com

Then you can easily sync with rsync myfile cloud9-env1:$(pwd)/

Summary

as you design your layout, think of keeping it consistent over time and across machines. That way, wherever you are working, you'll have all of the files you need

What's your layout look like?