"cd -" will jump back to the last directory you were at, regardless of where it is.
Add this to your .bashrc / .zshrc / whatever:
alias cdg='cd $(git rev-parse --show-cdup)'
And then type "cdg" to keep going up directories until you reach whichever folder contains your git repo. Useful when going from "/Users/philfreo/Projects/myproject/myproject/src/assets/js/views/" back up to "/Users/philfreo/Projects/myproject/"
Similarly, in zsh cd -n will take you to the nth-most-recent directory. 'dirs -v' will show the current state of the directory stack... you can do things like "dirs -v" + "cd -6" to figure out the number to use, then go to that directory.
Note that "git rev-parse --show-cdup" return the empty string if you are at the top of the git repo. So "cdg" as defined above will drop you in the hope directory if you are already at the top of your git tree.
Why not put something like this in your .bashrc or your .profile file instead?
function bd () {
OLDPWD=`pwd`
NEWPWD=`echo $OLDPWD | sed 's|\(.*/'$1'[^/]*/\).*|\1|'`
index=`echo $NEWPWD | awk '{ print index($1,"/'$1'"); }'`
if [ $index -eq 0 ] ; then
echo "No such occurrence."
else
echo $NEWPWD
cd "$NEWPWD"
fi
}
That way you don't have to execute a separate shell script and source its output. Also note that the "export OLDPWD" wasn't necessary in your script, either. Why pollute the environment of future processes spawned by your shell?
This article covers more advanced functionality than what's built in to shells but don't forget:
cd -
That goes to previous dir. A utility that follows this convention but adds some more features would be nice. For instance, maybe typing 'cd -2' could take me back two spots in history, like a web browser.
pushd and popd can be used maintain an easily rewindable history of places you have been. Use pushd to add the cwd to the stack and cd to another directory. Use popd to cd to the top dir on the stack and remove it.
I don't think it means you're getting old, necessarily. I'm well under 30, and I use the hell out of history. Whenever I need to do something complex, and I can't figure it out, my solution is often copy/pasted from the web. Bash history is often the only way I can remember which `sed` switch to use, or some complex `grep` operation.
In fact, I use history so much, I increased HISTFILESIZE[0] from 1000 commands to 10000.
I have tried stuff like this in the past, but I find it creates too much of a dependence on special configuration. My keymapping and vimrc are already enough. Instead, I usually just do a `cd ..` followed by up/enter/up/enter, which is very easy to type quickly.
An interesting aside: I can't seem to right click that link in Safari (6.0.5). It seems to be the "../../.." in the tag content that does it, because it works if I edit it out in the inspector. Does anyone else run in to this?
I implemented a fairly sophisticated system for navigating directories based on pushd and popd. I also set up a system based on CDPATH to hop quickly to directories I go to frequently. I fell out of the habit of using them once my usage patterns changed, though, and, since I gave "cd -" a new meaning, sometimes it confuses me. It's hard to come up with an interface that's intuitive enough to be future-proof.
I miss the feature of Novell Netware that used to let you type
cd ...
to go up two levels, or analogously for as many dots as you needed. It was incredibly useful and fast. Thanks for the tip, and I'm using these aliases from now on.
# Hah, I have almost the exact same thing in my bash_profile
up () {
TIMES=${1:-1};
for ((i=1; i<=$TIMES; i++));
do
cd ..
done
}
EDIT: Although now I'm looking at it and it looks like I made a strange choice with `TIMES=${1:-1};`. Oh well, I think it was my first bash script... it's funny to look back at the hack-y crap that your bash_profile accumulates over time.
Here's my, yet another, alternative to the many nice shell hacks out there: a bash/zsh "up" command that does "cd ..", or "up <n>" does "cd .." n times.
function up () { if test $# = 1 ; then s=$( printf "%$1s" ); s=${s// /..\/}; cd $s ; else cd .. ; fi; }
Hi, 'jump' is a great bookmarking system for the bash shell. But you'd only want to bookmark some most used directories.
I made 'bd' out of frustration to use 'cd ../..' all the time from "any" random directory. I can't bookmark all possible places. They are like slightly different tools.
I think it'll be awesome to use both jump and bd in the same system!
Please give 'bd' a try. Once you get used to 'bd', you'll use it frequently without thinking. :)
Thanks. z is great! If only I had found this before. I actually googled a lot before writing this (last year April) but couldn't find something like z.
Anyways z always changes directory. Using bd within backticks will just print the path without changing the directory. We can use that with other commands like ls, zip etc. Example: "ls `bd <starting letters>`" would only print the contents without changing the directory.
Very useful! Thank you ver much! Although I'd like to add one suggestion and that is to surpress an 'echo' on successful navigation. I'd see my path twice right underneath of eachother, which just clutters up the screen.
Smart idea. Good job! Could you extend bd to jump to bookmarked directories. I often jump between /data... and ~/dir/containing/code/ -- would be useful to have one command help with both scenarios.
"cd -" will jump back to the last directory you were at, regardless of where it is.
Add this to your .bashrc / .zshrc / whatever:
alias cdg='cd $(git rev-parse --show-cdup)'
And then type "cdg" to keep going up directories until you reach whichever folder contains your git repo. Useful when going from "/Users/philfreo/Projects/myproject/myproject/src/assets/js/views/" back up to "/Users/philfreo/Projects/myproject/"