Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Dtags: Directory Tags for Lazy Programmers

Build CodeQL codecov PyPI version GitHub license Python version

Dtags is a command-line tool that lets you tag directories for faster filesystem navigation and command execution.

Demo GIF


  • Recent versions of Bash, Zsh or Fish
  • Python 3.6+


Install via pip:

pip install dtags

For Bash, add the following line in ~/.bashrc:

source <(dtags-activate)

For Zsh, add the following line in ~/.zshrc:

autoload -U +X compinit && compinit
autoload -U +X bashcompinit && bashcompinit

source <(dtags-activate)

For Fish, add the following line in ~/.config/fish/

dtags-activate fish | source

For Git Bash on Windows, add the following lines in ~/.bashrc:

source <(dtags-activate)

Restart your shell. The following commands will be available after:

tag --help
untag --help
tags --help
d --help
run --help

Tab-completion should work out-of-the-box.


Tag directories with tag:

# Tag directory ~/foo with "work" (tags are indicated with the "@" prefix)
$ tag ~/foo -t work
/home/user/foo +@work

# If tag names are not specified, directory basenames are used instead
$ tag ~/foo
/home/user/foo +@foo

# Tag directories ~/bar and ~/baz with "app" and "work" (many-to-many)
$ tag ~/bar ~/baz -t app work
/home/user/bar +@app +@work
/home/user/baz +@app +@work

Execute commands in one or more directories with run:

# Run "git status" in all directories tagged "work"
$ run work -c git status

# Run "git status" in directories ~/foo and ~/bar
$ run ~/foo ~/bar -c git status

# Mix tags and directory paths
$ run work ~/foo -c git status

Change directories by path or tag with d:

# Go to directory tagged "work" 
# If there are multiple directories, a selection prompt is displayed
$ d work

# Go to directory ~/foo (works just like cd)
$ d ~/foo

# Use -t/--tag to always assume the argument is a tag
$ d -t foo

Untag directories with untag:

# Remove tags "app" and "work" from directory ~/foo and ~/bar
$ untag ~/foo ~/bar -t app work

# Remove all tags from directory ~/foo
$ untag ~/foo

# Remove tag "app" from all directories
$ untag -t app

Manage tags with tags:

# List all tags
$ tags

# List all tags in JSON format
$ tags --json

# Clean invalid directories
$ tags --clean

# Remove all tags
$ tags --purge

Use --help to see more information on each command.

Technical Notes

  • Tags are saved in ~/.dtags directory (created when a dtags command is first run).
  • The files in ~/.dtags are not meant to be edited manually.
  • By default, directory paths take precedence over tags when name collisions occur.
  • Tag names are automatically slugified (e.g. "foo bar" to "foo-bar").
  • Tag names are displayed with the "@" character prefix for easy identification.
  • Directory paths and tag names are ordered alphabetically.


Run the following commands to completely uninstall dtags:

$ pip uninstall dtags
$ rm -rf ~/.dtags

Then remove the dtags-activate line from your shell runtime configuration.