Even if you've been using the cd command for years, you might be
surprised at some of its features. After all, when did you last run
man cd? (For a link to the documentation for the
cd command, see Resources.)
The cd command has a few little tricks that can save you
lots of unnecessary typing. Considering how often you have to change
directories, that's good news for you.
This article looks at the UNIX® directory structure and shows how you can see your current directory path and add your directory to your shell prompt. After looking at some simple cd examples, the article explains what is meant by the absolute path and the relative path and when to use each one. Then, I share some of my favourite time-saving cd shortcuts, such as how to get to your home directory and how to identify the home directory of any user. I show how to toggle back and forth between two directories and provide a little-known gem about cd that I like to call the cd shuffle. It's a simple way of moving between two similar directory paths.
Before looking at changing directories, however, it's important to understand a bit about the UNIX directory structure.
What you may know as folders in Windows® operating systems are called directories in UNIX. A directory is a container that holds groups of files and other directories.
All directories in UNIX branch downward from the root directory, denoted by the
forward slash (/). For example:
- The directory /usr is a subdirectory of the root directory
(
/). - The /usr/spool directory is a subdirectory of /usr.
- The /usr/spool/mail directory is a subdirectory of /usr/spool.
. . . and so on.
From a shell prompt, you can display the path name of the directory you're
in by running the command pwd, shown in
Listing 1. Remember this command as the
present working directory.
Listing 1. Display the present working directory (pwd)
# pwd # /home/anthony |
To change to another directory, use cd followed by a
space, and then the directory you want to go to. Remember that UNIX commands
are case-sensitive, so make it all lowercase unless the directory name actually
has uppercase letters in it. In the examples in Listing 2, each
directory I'm changing to starts with a slash (/), because
I'm using the absolute path, tracing the trail of directories all the way
from the root directory.
Listing 2. The cd command using an absolute path
# cd /var # cd /usr/spool/mail # cd /home/anthony |
You can get to any directory at all—if you have permission (you need execute permission)—using its absolute path name. The commands in Listing 2 are provided as examples. You wouldn't ordinarily run two cd commands in a row, because the point of changing your working directory is to do some work in it, not to move on to somewhere else straight away.
If the directory you entered isn't a valid directory or you don't have permission to go there, the cd command reports an error. If your cd command fails, then you stay in the directory you started from.
Okay. Your cd command didn't report any failures, so you assume that it worked. But it would be nice to know for sure which directory you're now in.
Of course, you could run the pwd command every time you
need to check the current working directory, but there's a better way. Whenever you
run the cd command successfully, the new working
directory is stored in the environmental variable $PWD (Present Working Directory).
Note that this variable is in uppercase letters, unlike the pwd
command. So, you could display the value of $PWD using echo,
as you can see in Listing 3.
Listing 3. Display $PWD
# echo $PWD # /home/anthony |
Doesn't seem much easier than running that pwd
command you saw earlier, does it? Still, it's helpful to know that your directory
is stored in a variable. Here's why: You can display the value of $PWD as part of
the shell prompt.
In the examples used so far, the shell prompt is set to the hash, or pound, symbol
(#). But if you include $PWD in your shell prompt,
you always know what directory you're in. Then, when you run
cd, the variable PWD will be updated and displayed
as part of the shell prompt.
You can set the shell prompt variable PS1 in your .profile in your home directory by adding the lines shown in Listing 4.
Listing 4. Include $PWD in the shell prompt
PS1='${PWD} > '
export PS1
|
When you next log in, your .profile should execute as part of the login process, and this should display the working directory as part of the shell prompt. If you know how to get to your home directory, you could execute the .profile right now (see Listing 5).
Listing 5. Execute your new .profile with the new shell prompt
# . ./.profile /home/anthony > |
You can tailor the prompt to include the host name, your login name, or some other display characters. For details about enhancing the shell prompt, see the link to the article "Tip: Prompt magic" in Resources.
It's a bit cumbersome using absolute paths when you only want to jump from one branch of the tree to another nearby. That's why cd allows you to use relative paths. By default, the relative path refers to the directory relative to the current directory you are in. Using the relative path often means fewer keystrokes, although that depends on the directory you are going from and the one you're headed to.
To get from /home/anthony to /home/anthony/bin, for example, you don't have to enter the absolute path of the target directory (/home/anthony/bin); it's enough to enter the new path relative to the one you're already in, as you can see in Listing 6.
Listing 6. The cd command using a relative path
/home/anthony > cd bin /home/anthony/bin > |
Notice how the shell prompt shows the new value for $PWD.
If you run the ls command using the
-a flag, you can see an entry for
. (dot) and another for
.. (dot-dot). The single dot represents the
current directory. The two dots are for the parent directory—the one
immediately above the directory you're in.
Using the parent directory is handy when you want to go up a level via cd. Listing 7 shows how.
Listing 7. Using the cd command to go to the parent directory (dot-dot)
/var/spool/mqueue > cd .. /var/spool > |
You can then head down to a new subdirectory (see Listing 8 ).
Listing 8. Using cd to go to a subdirectory
/var/spool > cd mail /var/spool/mail > |
Or, you could do all of that in a single command, as you see in Listing 9.
Listing 9. Branch to branch in one command
/var/spool/mqueue > cd ../mail /var/spool/mail > |
You can even jump up a couple of levels, and then down a couple, as shown in Listing 10.
Listing 10. Jump through branches
/usr/IBM/WebSphere/AppServer/profiles > cd ../../PortalServer/log /usr/IBM/WebSphere/PortalServer/log > |
Once you get used to using the relative path, it becomes second nature.
Every UNIX user has a home directory that is defined when the user is created. You
could look up your home directory in /etc/passwd or use
smit, but there's a better way of getting home.
If you want to get to your own home directory, use the cd command without any parameters, as shown in Listing 11.
Listing 11. Fast-track home with cd
/usr/IBM/WebSphere/PortalServer/log > cd /home/anthony > |
Your home directory is stored in the variable $HOME. That means that the
cd command without parameters is equivalent
to typing cd $HOME (see Listing 12).
Listing 12. cd $HOME
/var/spool/mail > cd $HOME /home/anthony > |
That $HOME variable is useful for knowing your home directory even if you're not
headed there just yet. In fact, the $HOME variable can be so helpful that it's
got an alias: the tilde (~).
You may want to view or work on files in your home directory. If you're in some other directory, there's no need to go home first or to type the full directory path. Just use the tilde character. In Listing 13, I make a copy of my .profile in my home directory, all from the comfort of somewhere else.
Listing 13. Tilde shortcut for $HOME
/usr/IBM/WebSphere > cp ~/.profile ~/.profile.save |
Remote access to your neighbour's home
You can also use tilde to list or work with files in another user's home directory (if your permissions allow it). To do this, just use tilde followed by the user's login name, as Listing 14 shows.
Listing 14. Tilde is everyone's HOME
/home/anthony > cp ~john/.profile ~john/.profile.save |
This is safer than guessing the user's home directory and easier than looking it up in /etc/passwd.
Quite often, you need to change directory only to run a command or two, and then
return to the directory you were in previously ($OLDPWD). To do that, use the
cd dashback. That's cd
followed by a dash (cd -). In Listing 15,
notice how the $PS1 shell prompt displays the new directory each time I run
cd.
Listing 15. Return to previous directory
/home/anthony > cd /usr/sys/inst.images /usr/sys/inst.images > cd - /home/anthony > |
A consequence of this cd dashback is that if you enter it twice, you can toggle back and forth between two directories. This functionality could be useful if you wanted to change a program or configuration file in one directory and see the results in a log file in a different directory. Listing 16 shows the toggle between two directories. As with the other examples, I'm skipping the commands you might run right after you've actually changed directory.
Listing 16. Toggle between $PWD and $OLDPWD
/data/log > cd /apps/config /apps/config > cd - /data/log > cd - /apps/config > |
The feature that I find especially helpful is the cd shuffle. It's a simple way of switching from an old directory to a new one when the two directory paths have only one difference, such as a single word.
The syntax may look odd to UNIX old hands if they have never used it, but it works. See Listing 17.
Listing 17. cd shuffle syntax
cd directorya directoryb |
The first parameter is the string you want to replace in the current directory path.
The second parameter is the replacement string. For example, to move from v7
to v8, you just type cd v7 v8, as you can see in
Listing 18.
Listing 18. Using cd shuffle
/programs/v7/reports/monthly > cd v7 v8 /programs/v8/reports/monthly > |
That single command has saved 19 keystrokes! That's much simpler than going up three parent directories, and then heading back down the directory tree or using the absolute path.
This two-parameter cd command has lots of uses: swapping between similar directory paths where the only difference is a database instance name, a branch name, or maybe a date. The cd shuffle can save you thousands of keystrokes in a very short time.
If you have a directory for each year and each month of history, cd shuffle allows you to jump around from one year to another. See how it works in Listing 19.
Listing 19. New year
/hist/2010/april/reports > cd 2010 2011 /hist/2011/april/reports > |
If you want to change to a different month within the same year, use cd shuffle with the from month and the to month as its parameters, as shown in Listing 20.
Listing 20. Swap month directory
/hist/2011/april/reports > cd april may /hist/2011/may/reports > |
If two directory paths have only one string different, cd shuffle is ideal.
When I use cd in scripts, I always verify that the change directory has worked before continuing with the next command. I once saw an operating system wiped out by a two-line cleanup script that had been working every day for two years. An NFS-mounted directory became unavailable when a remote host was turned off. The cd command failed, and the cleanup script continued anyway until there was nothing left on the system to clean up.
A simple way of verifying that cd worked before proceeding
with something else is to use the shell short-circuit &&
straight after a cd command. If the
cd command fails, the next command won't continue.
See Listing 21.
Listing 21. cd and short-circuit
cd /some/dir && rm *.log |
In this article, you learned about the cd command. You saw how to change directories using the absolute path and the relative path, and you learned how to display the working directory you are in and toggle back and forth between two directories. You saw different ways of referring to home directories, and you learned about the little-known cd shuffle, which allows you to substitute a string in your current path and switch to a new path.
The cd command is so important on the command line, and it's used so often, that it's worth knowing some of its many shortcuts.
Learn
-
Read the command
reference for the cd command.
-
Get an introduction to
AIX
file systems and directories.
-
Customise your shell prompt using Tip:
Prompt magic (Daniel Robbins, developerWorks, September 2000).
-
AIX and UNIX developerWorks
zone: The AIX and UNIX zone provides a wealth of information relating to
all aspects of AIX systems administration and expanding your UNIX skills.
-
New to AIX and UNIX?
Visit the New to AIX and UNIX page to learn more.
-
Technology
bookstore: Browse the technology bookstore for books on this and other
technical topics.
Discuss
-
Check out Anthony's blog on developerWorks called
AIX
Down Under.
-
Follow Anthony on Twitter and keep up with
his blog updates.
- Follow developerWorks on Twitter.
- Get involved in the My developerWorks community.
-
Participate in the AIX and UNIX® forums:
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- Performance Tools Forum
- Virtualization Forum
- More AIX and UNIX Forums

Anthony English is an independent contractor from Sydney, Australia. He has worked on AIX systems since 1991 and writes the IBM developerWorks blog, AIX Down Under. You can reach Anthony at anthonyenglish@levitar.com.au.




