How do I use pushd and popd commands?
pushd
, popd
, and dirs
are shell builtins which allow you manipulate the directory stack. This can be used to change directories but return to the directory from which you came.
For example
start up with the following directories:
$ pwd
/home/saml/somedir
$ ls
dir1 dir2 dir3
pushd to dir1
$ pushd dir1
~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir1 ~/somedir
dirs
command confirms that we have 2 directories on the stack now. dir1
and the original dir, somedir
. NOTE: Our "current" directory is ~/somedir/dir1
.
pushd to ../dir3 (because we're inside dir1
now)
$ pushd ../dir3
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ dirs
~/somedir/dir3 ~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir3
dirs
shows we have 3 directories in the stack now. dir3
, dir1
, and somedir
. Notice the direction. Every new directory is getting added to the left. When we start popping directories off, they'll come from the left as well.
manually change directories to ../dir2
$ cd ../dir2
$ pwd
/home/saml/somedir/dir2
$ dirs
~/somedir/dir2 ~/somedir/dir1 ~/somedir
Now start popping directories
$ popd
~/somedir/dir1 ~/somedir
$ pwd
/home/saml/somedir/dir1
Notice we popped back to dir1
.
Pop again...
$ popd
~/somedir
$ pwd
/home/saml/somedir
And we're back where we started, somedir
.
Might get a little confusing, but the head of the stack is the directory that you're currently in. Hence when we get back to somedir
, even though dirs
shows this:
$ dirs
~/somedir
Our stack is in fact empty.
$ popd
bash: popd: directory stack empty
There is a really useful use case for pushd
and popd
commands for working with several folders simultaneously.
You can navigate the stack very easily, since it is enumerated. Meaning, you can have several working folders at your disposal during work.
See a simple example below.
First, let's create example folder structure.
user@vb:~$ mkdir navigate
user@vb:~/navigate$ mkdir dir1
user@vb:~/navigate$ mkdir dir2
user@vb:~/navigate$ mkdir dir3
Then you can add all your folders to the stack:
user@vb:~/navigate$ pushd dir1/
~/navigate/dir1 ~/navigate
user@vb:~/navigate/dir1$ pushd ../dir2/
~/navigate/dir2 ~/navigate/dir1 ~/navigate
user@vb:~/navigate/dir2$ pushd ../dir3/
~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate
You can look it up by:
user@vb:~/navigate/dir3$ dirs -v
0 ~/navigate/dir3
1 ~/navigate/dir2
2 ~/navigate/dir1
3 ~/navigate
To navigate safely, you need to add the last (zero) folder twice, since it will be always rewritten:
user@vb:~/navigate/dir3$ pushd .
user@vb:~/navigate/dir3$ dirs -v
0 ~/navigate/dir3
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
Now, you can jump around through these folders and work with stack as with aliases for the folders. I guess the following part is self explanatory:
user@vb:~/navigate/dir3$ cd ~4
user@vb:~/navigate$ dirs -v
0 ~/navigate
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
user@vb:~/navigate$ cd ~3
user@vb:~/navigate/dir1$ dirs -v
0 ~/navigate/dir1
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
user@vb:~/navigate/dir1$ touch text.txt
user@vb:~/navigate/dir1$ cp text.txt ~2
user@vb:~/navigate/dir1$ ls ~2
text.txt
user@vb:~/navigate/dir1$ dirs -v
0 ~/navigate/dir1
1 ~/navigate/dir3
2 ~/navigate/dir2
3 ~/navigate/dir1
4 ~/navigate
Additional tip is to create some alias for dirs -v
.
For example:
# In ~/.bashrc
alias dirs="dirs -v"
One simple use case for using dirs stack what you cannot do by just cd is:
pushd .
adds current directory XX to dirs
stack. Afterwards, you can move around using cd
, and to return to XX you just do popd
regardless of how "far away" are you in the directory tree (can jump over multiple levels, sideways etc). Especially useful in bash scripts.