This post is inspired by the terrible experiences I had when I first started working in the command line and is hopefully a better introduction to working with it in OS X. Before we go any further, I highly suggest you download and install iTerm2 because the default Terminal.app can be a bit little lacking. Once installed, keep it in your dock. It's your new best friend.

If you're not comfortable with that option, you can always use the default terminal found in OS X at: Applications > Utilities > Terminal.app

Terminal.app

Throughout this post I'll have code examples to highlight commands and their output. The examples will use the following documentation style:

  • the commands you'll be typing in will be the first line of every example and any lines that are not grayed out
  • be sure to hit the enter key after you've confirmed the commands you've typed out, if not the terminal will not process the command
  • comments will start with a # and will be grayed out

Here's an example below that you can try out. The command is the first line and the expected result of the command is commented out in the second line.

echo "hello world"
# hello world

The command you just entered prints out or "echos" a message that you specify. That example isn't that useful but the next examples will guide you through the core concepts needed to make the most of the terminal. These concepts include:

  • Navigating the File System
  • Manipulating the File System
  • Helpful Tips & Tricks
  • Shells & Settings

First things first, when you run a command, it is always run from a folder on your system. This context or working directory is important to know since some commands are run relative to this. To show or "print" your current working directory, run the following command.

pwd
#  /Users/yourusername

Don't worry if your output doesn't look like /Users/yourusername, the next command, cd, will get you back on track.

Change Directory - Part One

The change directory command helps you navigate through your file system. Run the following command to navigate to your home directory.

cd

There's no output for this command but if you run pwd again you should see your home directory.

Open Current Directory

So now that we know where we are, the next command will open the Finder.app to help us relate what's "around" us.

open .
# A Finder window with your home directory should have opened up

List Directory Contents

Run the following command to list the current directory contents, which in our case would be our users main folders.

ls
# Desktop Documents Downloads Library Movies Music Pictures Public Sites

Command Arguments

Any characters that come after a command can be considered an argument. Arguments may also be referred to as flags, options or parameters. Arguments alter the default options for a command.

The output from the previous command was hard to read. To list directory contents in a proper list, add a -l argument to the previous ls command.

ls -l
# Desktop
# Documents
# Downloads
# Library
# etc.

To also include normally hidden files, like dotfiles -> .example, use the -la argument.

ls -la
# .bash_history (example of hidden file)
# .DS_Store
# Desktop
# Documents
# etc.

Change Directory - Part Two

Now that we know arguments, let's use them to move around our file system. Run the change directory command with ~/Documents as an argument to navigate to your Documents folder. Note, the ~/ is a shorthand notation for the path to your users home directory. ~/ is equal to /Users/yourusername.

cd ~/Documents

Next, lets print our new working directory

pwd
# /Users/yourusername/Documents

Next let's print out the same stuff you'd see in Finder.app for the Documents directory

ls -la

Good stuff so far? Lets go a little bit further.

Manipulating the File System

Next up, we'll be working from our Desktop directory to create a few child directories and files. Remember, you can use your Finder app to verify the commands you have run. Let's go ahead and change our working directory to the Desktop.

cd ~/Desktop

Make Directory

To create a directory or folder, you'll use the mkdir command. Let's create a directory on the desktop called "tmp" by running the following command.

mkdir tmp

Create Files

Before we create files, navigate to the tmp directory we just created.

cd tmp

Now we can create a few files using the touch command.

touch foo.txt
touch bar.txt

Next, let's create another directory and create a file inside it. We can create files that are not in our current working directory by specifying the path to the file we want to create, test/sample.txt.

mkdir test
touch test/sample.txt

Use ls -l or open this up in finder (open .) to visualize what we've created.

Copy

In order to copy files we'll use the cp command. Try copying foo.txt.

cp foo.txt foo_copy.txt

Next let's copy the test directory we made earlier and name this new copy exam. We'll have to use the -r argument to ensure it recursively copies the directory and any files inside of it.

cp -r test exam

In this last cp example we'll copy bar.txt into the exam directory.

cp bar.txt exam/bar.txt

Here's a break down of the cp command

  • the first argument after cp is the file or directory location
  • the second argument is the destination of the file or directory
  • cp filename.txt copyoffilename.txt or cp -r dir_path dir_path_copy

Move & Rename Files

The mv command allows you to move files or directories. Try it out by moving the file foo.txt inside of the exam directory.

mv foo.txt exam

Next, let's move the test directory inside of the exam directory.

mv test exam

It sounds weird but we can also rename files by using the same mv command. Let's practice renaming a file by changing bar.txt to foobar.txt.

mv bar.txt foobar.txt

Next, we'll practice renaming a directory by changing exam to quiz.

mv exam quiz

Remove/Delete

The rm command is used to delete files and/or directories. Unlike deleting a file or folder form the Finder app, this command does not move things to the Trash bin. Let's try using the rm command to delete the file foobar.txt.

rm foobar.txt

Next, let's delete the test directory within the quiz folder. We'll pass -rf as an argument to remove everything within quiz/test.

rm -rf quiz/test

Tips & Tricks

History

Use the up and down arrow keys to go through your history of commands. To view your entire history of commands, use the history command.

history

To search your history of commands for something like "mkdir" (to see which directories you created), use grep in the following pattern.

# history | grep "text to search"
history | grep "mkdir"

In the previous command we used the | or pipe character. It's used to pass in the output from the command on the left, history and pipes it into the next command, grep mkdir. I can't stress how much this command combo has saved me.

Fix permissions

Permission errors are the most common problems I see people run into using the command line. Usually this happens when installing a language or language dependency. To fix this, run the following command to set your current user as the owner of the /usr/local directory.

sudo chown -R `whoami` /usr/local

Add a shortcut to your editor

If you're using Sublime Text, it'll be very useful to have the subl command available to launch the app from the command line. With this you can pass in files or directories to open them directly in Sublime Text.

ln -s "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl

Example usage:

# to edit a file foo.txt
subl foo.txt

# to open the current directory
subl .

Wrapping up

Alright! I think that covers the most important skills for working with the terminal, navigating and manipulating the file system. With this knowledge you'll have a better experience learning other cool tips or advanced stuff, like using git. In a future post I'll cover some other topics like shells, terminal settings, aliases and environment variables. As always, if you run into any issues with the commands above or if you have any feedback, feel free to leave a comment or open up a github issue.