Goto Directory - A fuzzy directory navigation tool for command line Ninjas
Very early in my career, I built a command line utility in C/Assembly called gd - "go directory" that allowed me to navigate to directories based on patterns. I've been missing that little tool ever since. So, I rebuilt it in Rust.
Godir supports direct navigation using relative or absolute paths:
godir ../projects # Navigate to relative path
godir /Users/name/dev # Navigate to absolute path
godir ~/dev/project # Navigate using shell expansionWhen using a path (instead of a pattern), godir will:
- Expand the path to its full canonical form
- Verify it's a valid directory
- Add it to the configuration file if not already present
- Navigate to the directory
This makes it easy to add new directories to your configuration while navigating to them.
godir . # Matches the current directory and adds it to the configuration file
godir dev # Matches any directory containing "dev"
godir ^/Users # Matches directories starting with "/Users"
godir project$ # Matches directories ending with "project"
godir dev/./src # Matches paths containing "dev/" followed by any characters, then "/src"
godir 'test|prod' # Matches directories containing either "test" or "prod"
godir 'lionheart.*crons' # Matches directories containing "lionheart" followed by any characters, then "crons": ~/dev/lionheart-backend/Lionheart-Boreal/app/cronsGodir supports Regex pattern matching expressions:
foo- Matches any directory containing "foo"^foo- Matches directories that start with "foo"foo$- Matches directories that end with "foo"foo|bar- Matches directories containing either "foo" or "bar"
dev/foo- Matches directories containing "dev/foo"/Users/name- Matches exact path segments^/Users/name- Matches paths starting from root
.- Matches any single character.*- Matches zero or more of any character\w- Matches word characters (letters, digits, underscore)\d- Matches digits\s- Matches whitespace
On Mac's you can brew install godir.
brew tap cjus/godir
brew install godirMake sure to follow the post install instructions.
Prebuilt binaries are also available for macOS, Linux, and Windows in the releases section. Download the appropriate binary for your system and add it to your PATH.
To ensure godir can change the current shell directory, add this shell function to your shell's configuration file (~/.bashrc, ~/.zshrc, etc.):
Replace PATH_TO_GODIR with the path to the godir binary.
godir() {
local output
output="$(command PATH_TO_GODIR/godir "$@")"
if [ $? -eq 0 ]; then
if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]] || [[ "$1" == "--version" ]] || [[ "$1" == "-V" ]] || [[ "$1" == "--list" ]] || [[ "$1" == "-l" ]]; then
echo "$output"
elif [ -n "$output" ]; then
cd "$output"
fi
fi
}For Windows PowerShell, add this function to your PowerShell profile (usually at $PROFILE):
function godir {
$output = & godir.exe $args
if ($LASTEXITCODE -eq 0) {
if ($args -contains "--help" -or $args -contains "-h" -or $args -contains "--version" -or $args -contains "-V" -or $args -contains "--list" -or $args -contains "-l") {
Write-Output $output
}
elseif ($output) {
Set-Location $output
}
}
}Then reload your shell configuration:
- Unix:
source ~/.bashrc(or ~/.zshrc) - Windows:
. $PROFILE
godir <pattern>Pro Tip: to quickly add the current directory to the configuration file, use the . pattern.
godir .The godir command maintains an editable configuration file. You can find the directories.json file in the .godir directory under the user's home directory. The configuration file is used to store the directories that godir knows about.
Here's an example of what the directories.json file looks like:
{
"directories": [
"/Users/cjus/dev/commercial",
"/Users/cjus/dev/commercial/apps/demo-redis",
"/Users/cjus/dev/godir",
"/Users/cjus/dev/moose",
"/Users/cjus/dev/moose_redis",
"/Users/cjus/dev/redis-user-create"
],
"excludes": [
".git",
".next",
"/Applications",
"/cores",
"/Library",
"/private",
"/System",
"/usr",
"/var",
"/Volumes",
"dist",
"iCloud",
"node_modules",
"target"
]
}Manually edit the configuration file to add or remove directories.
To exclude directories, add related patterns to the excludes array.
Notes:
- If you use a pattern that
godirdoesn't reconize then it will give you the option to add a directory path on the spot or ask if you'd like it to perform a full directory scan. It will then add the directory path(s) it matches to the configuration file. - After a full directory scan, you should edit the
~/.godir\directories.jsonfile to cleanup any entries that you don't care about. You can also add patterns to theexcludesarray to exclude directories from future scans.
Remember, to quickly add the current directory to the configuration file, use the . pattern.
godir .